Skip to main content

DendroViz

GitHub Actions CI PyPI version License

DendroViz takes CSV, JSON, or Newick input and turns it into a dendrogram dataset. The CSV output can be used in Tableau and other charting tools. The tool can also create SVG images.

Vertical tree with straight lines
Vertical straight preview
Horizontal tree with curved lines
Horizontal curved preview
Radial tree with split lines
Radial split preview

Table of Contents

Installation

pip install dendroviz

Install the optional Newick parser only if you need it:

pip install biopython

For local development:

pip install -e .[dev]

Quickstart

Python API

from dendroviz import DendrogramGenerator, LayoutOptions

generator = DendrogramGenerator()
result = generator.generate_tree(
    "examples/dummy_deep.csv",
    tree_layout="radial",
    line_style="split",
    output_csv="build/dummy-deep-radial-split.csv",
    output_json="build/dummy-deep.json",
    output_svg="build/dummy-deep-radial-split.svg",
    options=LayoutOptions(
        label_mode="leaves",
        show_internal_nodes=True,
        show_root_node=True,
        label_orientation="auto",
        label_offset=24,
        colour_mode="palette",
        palette="set2",
        palette_depth=2,
    ),
)

print(len(result.nodes), len(result.edges))

CLI

dendroviz build examples/dummy_deep.csv \
  --input-format csv \
  --tree-layout radial \
  --line-style split \
  --output-svg build/dummy-deep-radial-split.svg \
  --label-mode leaves \
  --label-orientation auto \
  --label-offset 24 \
  --colour-mode palette \
  --palette set2 \
  --palette-depth 2 \
  --show-palette-legend

Example test runs:

dendroviz build examples/dummy_small.csv \
  --tree-layout vertical \
  --line-style straight \
  --output-csv build/dummy-small-vertical-straight.csv \
  --output-svg build/dummy-small-vertical-straight.svg \
  --label-mode all \
  --label-orientation auto \
  --colour-mode palette \
  --palette set2 \
  --palette-depth 2

dendroviz build examples/dummy_small.csv \
  --tree-layout horizontal \
  --line-style curved \
  --output-csv build/dummy-small-horizontal-curved.csv \
  --output-svg build/dummy-small-horizontal-curved.svg \
  --label-mode all \
  --label-offset 28 \
  --colour-mode palette \
  --palette set2 \
  --palette-depth 2

dendroviz build examples/dummy_deep.csv \
  --tree-layout radial \
  --line-style split \
  --output-csv build/dummy-deep-radial-split.csv \
  --output-svg build/dummy-deep-radial-split.svg \
  --label-mode leaves \
  --label-orientation auto \
  --colour-mode palette \
  --palette set2 \
  --palette-depth 2

Try it with the included dummy data:

Input Format

CSV

The library expects a single rooted tree with exactly these columns:

id,parent,label,order
root,,Root,0
branch_a,root,Branch A,0
branch_b,root,Branch B,1
leaf_a1,branch_a,Leaf A1,0
leaf_a2,branch_a,Leaf A2,1
leaf_b1,branch_b,Leaf B1,0

Rules:

  • id must be unique
  • parent is empty for the single root row
  • every non-root parent must exist
  • order controls sibling order and must be numeric
  • cycles are not allowed

JSON

JSON input uses the same row fields as CSV. The loader accepts either:

  • a top-level array of node objects
  • an object with a nodes array

Each node object should include:

  • id
  • parent
  • label
  • order

Example:

{
  "nodes": [
    { "id": "root", "parent": null, "label": "Root", "order": 0 },
    { "id": "left", "parent": "root", "label": "Left", "order": 0 },
    { "id": "right", "parent": "root", "label": "Right", "order": 1 }
  ]
}

Rules:

  • id must be unique
  • parent is null for the single root row
  • every non-root parent must exist
  • order controls sibling order and must be numeric
  • cycles are not allowed

Newick

Newick input is also supported when BioPython is installed. Install it with pip install biopython:

from dendroviz import DendrogramGenerator

generator = DendrogramGenerator()
tree = generator.load_tree("examples/tree.nwk", input_format="newick")

Sibling order is taken from the order children appear in the Newick file. Branch lengths are used directly when present, and branch_length_spacing controls how much screen space each unit of branch length gets so length-based trees remain readable. If a Newick tree omits branch lengths, the library falls back to its depth-based spacing. In Newick, :1 means the branch has length 1.

CLI Reference

Mandatory

Option Values Notes
build subcommand Generate dendrogram artefacts from an input tree
input path path Path to the input tree file
--tree-layout radial, vertical, horizontal radial uses angle/radius coordinates, vertical grows top-to-bottom, horizontal grows left-to-right
--line-style curved, split, straight curved uses smooth splines, split branches at forks, straight uses direct segments
output flag(s) --output-csv, --output-json, --output-svg Write one or more render artefacts

Optional

These CLI flags map directly to LayoutOptions fields in the Python API.

Option Values Notes
--log-level CRITICAL, ERROR, WARNING, INFO, DEBUG Controls CLI verbosity
--label-mode all, leaves, none all shows every label; leaves shows labels only on leaf nodes; none hides all labels
--label-orientation horizontal, auto auto is the default; it points labels away from the tree trunk in radial and vertical layouts
--label-offset float Pushes labels farther from the tree
--font-size int Controls label size
--hide-internal-nodes flag Hides non-leaf node markers
--hide-root-node flag Hides the root node marker
--colour-mode global, palette global uses the explicit node, edge, and label colours; palette colours branches automatically
--palette preset name or hex colours Used only when --colour-mode palette is active
--palette-depth int Used only when --colour-mode palette is active; chooses which tree level gets palette colouring
--show-palette-legend flag Adds a small SVG legend when palette colouring is active
--show-svg-data-attributes flag Adds data-* metadata to SVG nodes and edges for browser scripting
--show-svg-titles flag Adds short hover titles to SVG nodes and edges
--svg-title-parts comma-separated parts Controls node tooltip content, for example label or label,group
--svg-title-template template string Controls node tooltip text, for example Family: {group}\nLanguage: {label}
--node-colour hex colour Fallback node colour in global mode
--edge-colour hex colour Fallback edge colour in global mode
--label-colour hex colour Fallback label colour in global mode

Advanced

These CLI flags map directly to LayoutOptions fields in the Python API.

Option Values Notes
--depth-spacing float Adjusts the gap between tree levels when the tree has no usable branch lengths
--branch-length-spacing float Scales Newick branch lengths into screen space when branch lengths are present
--sibling-spacing float Adjusts the gap between siblings
--radial-base-angle-deg float Sets the starting angle for radial layouts
--radial-sweep-deg float Sets the angular sweep for radial layouts
--scale float Enlarges SVG geometry, strokes, nodes, and text without changing the tree structure

Colour Palettes

All built-in palettes below are official ColorBrewer, Tableau, or Okabe-Ito palettes. set1 is the default palette.

Custom palettes are also supported:

  • In Python, pass a list or tuple of hex colours to LayoutOptions.palette
  • On the CLI, pass a comma-separated hex string with --palette, such as #112233,#445566,#778899
  • Hex colours are validated before export, so invalid values fail fast

Built-In Palettes

Name Swatches Hex codes
set1 set1 swatches #e41a1c #377eb8 #4daf4a #984ea3 #ff7f00 #ffff33 #a65628 #f781bf #999999
set2 set2 swatches #66c2a5 #fc8d62 #8da0cb #e78ac3 #a6d854 #ffd92f #e5c494 #b3b3b3
set3 set3 swatches #8dd3c7 #ffffb3 #bebada #fb8072 #80b1d3 #fdb462 #b3de69 #fccde5 #d9d9d9 #bc80bd #ccebc5 #ffed6f
pastel1 pastel1 swatches #fbb4ae #b3cde3 #ccebc5 #decbe4 #fed9a6 #ffffcc #e5d8bd #fddaec #f2f2f2
pastel2 pastel2 swatches #b3e2cd #fdcdac #cbd5e8 #f4cae4 #e6f5c9 #fff2ae #f1e2cc #cccccc
accent accent swatches #7fc97f #beaed4 #fdc086 #ffff99 #386cb0 #f0027f #bf5b17 #666666
paired paired swatches #a6cee3 #1f78b4 #b2df8a #33a02c #fb9a99 #e31a1c #fdbf6f #ff7f00 #cab2d6 #6a3d9a #ffff99 #b15928
tableau tableau swatches #1f77b4 #ff7f0e #2ca02c #d62728 #9467bd #8c564b #e377c2 #7f7f7f #bcbd22 #17becf
dark2 dark2 swatches #1b9e77 #d95f02 #7570b3 #e7298a #66a61e #e6ab02 #a6761d #666666
scientific scientific swatches #e69f00 #56b4e9 #009e73 #f0e442 #0072b2 #d55e00 #cc79a7 #000000

Contributing

Contributor guidance, local development commands, and the release process live in CONTRIBUTING.md.

Release files for dendroviz 0.1.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dendroviz 0.1.6
File Size Uploaded
dendroviz-0.1.6.tar.gz 38.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dendroviz 0.1.6
File Interpreter ABI Platform
dendroviz-0.1.6-py3-none-any.whl Python 3 none any Details

Total release size: 66.0 kB

Release files / dendroviz-0.1.6.tar.gz

Download URL dendroviz-0.1.6.tar.gz
Size 38.0 kB
Tags Source
SHA-256 checksum
How to use checksums
100d8cb97da66caa73f8a8c384c20b824c598ec5cab5c5b0a84fa896c98f4cbd
BLAKE2b-256 checksum
How to use checksums
41e7bc792855fdd8b532e36af5fd7fede0102fdce2f47bee0d4688b8b5ca0ef1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 27, 2026.

Transparency log

Release files / dendroviz-0.1.6-py3-none-any.whl

Download URL dendroviz-0.1.6-py3-none-any.whl
Size 28.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ef1127c72d61638e4aaa845bdf33db76dc8846ca448a1619e563016159b63811
BLAKE2b-256 checksum
How to use checksums
aff9306a6b26dae85c8d91c7cd2e9c239ae38ff1088ebb63050c3dddd39d54aa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 27, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.6 This release

2 release files

0.1.5

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page