hierarchical-clustering-diagrams-0.4: Draw diagrams of dendrograms made by hierarchical-clustering.

Safe HaskellNone
LanguageHaskell98

Diagrams.Dendrogram

Contents

Description

This module contain functions for drawing diagrams of dendrograms.

Synopsis

High-level interface

Given a dendrogram dendro :: Dendrogram a and a function drawItem :: a -> Diagram b for drawing the items on the leaves of dendro, just use dendrogram Variable drawItem dendro :: Diagram b to draw a diagram of dendro.

Runnable example which produces something like https://patch-tag.com/r/felipe/hierarchical-clustering-diagrams/snapshot/current/content/pretty/example.png:

import Data.Clustering.Hierarchical (Dendrogram(..))
import Diagrams.Prelude (Diagram, atop, lw, pad, roundedRect, text, (#))
import Diagrams.Backend.Cairo.CmdLine (Cairo, defaultMain)
import qualified Diagrams.Dendrogram as D

main :: IO ()
main = defaultMain diagram

diagram :: Diagram Cairo
diagram = D.dendrogram Fixed char test # lw 0.1 # pad 1.1

char :: Char -> Diagram Cairo
char c = pad 1.3 $ roundedRect (1,1) 0.1 `atop` text [c]

test :: Dendrogram Char
test = Branch 5
         (Branch 2
           (Branch 1
             (Leaf 'A')
             (Leaf 'B'))
           (Leaf 'C'))
         (Leaf 'D')
 

dendrogram :: (Monoid m, Semigroup m, Renderable (Path V2 Double) b) => Width -> (a -> QDiagram b V2 Double m) -> Dendrogram a -> QDiagram b V2 Double m Source #

dendrogram width drawItem dendro is a drawing of the dendrogram dendro using drawItem to draw its leafs. The width parameter controls how whether all items have the same width or not (Fixed or Variable, respectively, see Width).

Note: you should probably use alignT to align your items.

data Width Source #

The width of the items on the leafs of a dendrogram.

Constructors

Fixed

Fixed assumes that all items have a fixed width (which is automatically calculated). This mode is faster than Variable, especially when you have many items.

Variable

Variable does not assume that all items have a fixed width, so each item may have a different width. This mode is slower since it has to calculate the width of each item separately.

dendrogram' :: (Monoid m, Semigroup m, Renderable (Path V2 Double) b) => Width -> (a -> QDiagram b V2 Double m) -> Dendrogram a -> (QDiagram b V2 Double m, Dendrogram (a, X)) Source #

Same as dendrogram, but also returns the Dendrogram with positions.

Low-level interface

dendrogramPath :: Dendrogram X -> Path V2 Double Source #

A dendrogram path that can be stroked later. This function assumes that the Leafs of your Dendrogram are already in the right position.

fixedWidth :: Double -> Dendrogram a -> (Dendrogram (a, X), Double) Source #

fixedWidth w positions the Leafs of a Dendrogram assuming that they have the same width w. Also returns the total width.

variableWidth :: (Semigroup m, Monoid m) => (a -> QDiagram b V2 Double m) -> Dendrogram a -> (Dendrogram (a, X), QDiagram b V2 Double m) Source #

variableWidth draw positions the Leafs of a Dendrogram according to the diagram generated by draw. Each Leaf may have a different width. Also returns the resulting diagram having all Leafs drawn side-by-side.

Note: you should probably use alignT to align your items.

type X = Double Source #

The horizontal position of a dendrogram Leaf.