The same plot in 14 other libraries — Python: Altair, Bokeh, lets-plot, Matplotlib, Plotly, Pygal, Seaborn; R: ggplot2; Julia: Makie.jl; JavaScript: Chart.js, D3.js, Apache ECharts, Highcharts, MUI X Charts. Compare all 15 side by side: Phylogenetic Tree Diagram in Python, R, Julia and JavaScript.
A phylogenetic tree (evolutionary tree) visualization showing hierarchical relationships between species or sequences, with branch lengths proportional to evolutionary distance. This diagram reveals how organisms or genes evolved from common ancestors, with longer branches indicating greater divergence. Phylogenetic trees are essential for understanding evolutionary history, taxonomy, and molecular biology relationships.

""" anyplot.ai
tree-phylogenetic: Phylogenetic Tree Diagram
Library: plotnine 0.15.4 | Python 3.13.13
Quality: 90/100 | Updated: 2026-05-15
"""
import os
import numpy as np
import pandas as pd
from plotnine import (
aes,
annotate,
coord_cartesian,
element_blank,
element_rect,
element_text,
geom_point,
geom_segment,
geom_text,
ggplot,
labs,
scale_color_manual,
theme,
theme_void,
)
THEME = os.getenv("ANYPLOT_THEME", "light")
PAGE_BG = "#FAF8F1" if THEME == "light" else "#1A1A17"
INK = "#1A1A17" if THEME == "light" else "#F0EFE8"
INK_SOFT = "#4A4A44" if THEME == "light" else "#B8B7B0"
IMPRINT = ["#009E73", "#C475FD", "#4467A3", "#BD8233", "#AE3030", "#2ABCCD", "#954477"]
np.random.seed(42)
# Phylogenetic tree data for primate evolution (mitochondrial DNA based)
species = ["Human", "Chimpanzee", "Gorilla", "Orangutan", "Gibbon", "Macaque", "Baboon", "Lemur"]
n_species = len(species)
leaf_y = {species[i]: i for i in range(n_species)}
branch_data = {
"root": 0.0,
"haplorrhini": 0.15,
"strepsirrhini": 0.15,
"catarrhini": 0.25,
"hylobatidae": 0.25,
"hominoidea": 0.35,
"cercopithecidae": 0.35,
"homininae": 0.45,
"ponginae": 0.45,
"hominini": 0.55,
"gorillini": 0.55,
}
leaf_x = {
"Human": 0.65,
"Chimpanzee": 0.65,
"Gorilla": 0.60,
"Orangutan": 0.55,
"Gibbon": 0.50,
"Macaque": 0.55,
"Baboon": 0.55,
"Lemur": 0.45,
}
internal_y = {
"hominini": (leaf_y["Human"] + leaf_y["Chimpanzee"]) / 2,
"gorillini": leaf_y["Gorilla"],
"homininae": (leaf_y["Human"] + leaf_y["Chimpanzee"] + leaf_y["Gorilla"]) / 3,
"ponginae": leaf_y["Orangutan"],
"hominoidea": (leaf_y["Human"] + leaf_y["Chimpanzee"] + leaf_y["Gorilla"] + leaf_y["Orangutan"]) / 4,
"hylobatidae": leaf_y["Gibbon"],
"catarrhini": (leaf_y["Human"] + leaf_y["Chimpanzee"] + leaf_y["Gorilla"] + leaf_y["Orangutan"] + leaf_y["Gibbon"])
/ 5,
"cercopithecidae": (leaf_y["Macaque"] + leaf_y["Baboon"]) / 2,
"haplorrhini": (
leaf_y["Human"]
+ leaf_y["Chimpanzee"]
+ leaf_y["Gorilla"]
+ leaf_y["Orangutan"]
+ leaf_y["Gibbon"]
+ leaf_y["Macaque"]
+ leaf_y["Baboon"]
)
/ 7,
"strepsirrhini": leaf_y["Lemur"],
"root": sum(leaf_y.values()) / len(leaf_y),
}
segments = [
{
"x": branch_data["root"],
"xend": branch_data["haplorrhini"],
"y": internal_y["haplorrhini"],
"yend": internal_y["haplorrhini"],
"clade": "Haplorrhini",
},
{
"x": branch_data["root"],
"xend": branch_data["strepsirrhini"],
"y": internal_y["strepsirrhini"],
"yend": internal_y["strepsirrhini"],
"clade": "Strepsirrhini",
},
{
"x": branch_data["root"],
"xend": branch_data["root"],
"y": internal_y["haplorrhini"],
"yend": internal_y["strepsirrhini"],
"clade": "Root",
},
{
"x": branch_data["strepsirrhini"],
"xend": leaf_x["Lemur"],
"y": leaf_y["Lemur"],
"yend": leaf_y["Lemur"],
"clade": "Strepsirrhini",
},
{
"x": branch_data["haplorrhini"],
"xend": branch_data["catarrhini"],
"y": internal_y["catarrhini"],
"yend": internal_y["catarrhini"],
"clade": "Haplorrhini",
},
{
"x": branch_data["haplorrhini"],
"xend": branch_data["catarrhini"],
"y": internal_y["cercopithecidae"],
"yend": internal_y["cercopithecidae"],
"clade": "Haplorrhini",
},
{
"x": branch_data["haplorrhini"],
"xend": branch_data["haplorrhini"],
"y": internal_y["catarrhini"],
"yend": internal_y["cercopithecidae"],
"clade": "Haplorrhini",
},
{
"x": branch_data["catarrhini"],
"xend": branch_data["hominoidea"],
"y": internal_y["hominoidea"],
"yend": internal_y["hominoidea"],
"clade": "Hominoidea",
},
{
"x": branch_data["catarrhini"],
"xend": leaf_x["Gibbon"],
"y": leaf_y["Gibbon"],
"yend": leaf_y["Gibbon"],
"clade": "Hylobatidae",
},
{
"x": branch_data["catarrhini"],
"xend": branch_data["catarrhini"],
"y": internal_y["hominoidea"],
"yend": leaf_y["Gibbon"],
"clade": "Catarrhini",
},
{
"x": branch_data["catarrhini"],
"xend": leaf_x["Macaque"],
"y": leaf_y["Macaque"],
"yend": leaf_y["Macaque"],
"clade": "Cercopithecidae",
},
{
"x": branch_data["catarrhini"],
"xend": leaf_x["Baboon"],
"y": leaf_y["Baboon"],
"yend": leaf_y["Baboon"],
"clade": "Cercopithecidae",
},
{
"x": branch_data["catarrhini"],
"xend": branch_data["catarrhini"],
"y": leaf_y["Macaque"],
"yend": leaf_y["Baboon"],
"clade": "Cercopithecidae",
},
{
"x": branch_data["hominoidea"],
"xend": branch_data["homininae"],
"y": internal_y["homininae"],
"yend": internal_y["homininae"],
"clade": "Homininae",
},
{
"x": branch_data["hominoidea"],
"xend": leaf_x["Orangutan"],
"y": leaf_y["Orangutan"],
"yend": leaf_y["Orangutan"],
"clade": "Ponginae",
},
{
"x": branch_data["hominoidea"],
"xend": branch_data["hominoidea"],
"y": internal_y["homininae"],
"yend": leaf_y["Orangutan"],
"clade": "Hominoidea",
},
{
"x": branch_data["homininae"],
"xend": branch_data["hominini"],
"y": internal_y["hominini"],
"yend": internal_y["hominini"],
"clade": "Hominini",
},
{
"x": branch_data["homininae"],
"xend": leaf_x["Gorilla"],
"y": leaf_y["Gorilla"],
"yend": leaf_y["Gorilla"],
"clade": "Gorillini",
},
{
"x": branch_data["homininae"],
"xend": branch_data["homininae"],
"y": internal_y["hominini"],
"yend": leaf_y["Gorilla"],
"clade": "Homininae",
},
{
"x": branch_data["hominini"],
"xend": leaf_x["Human"],
"y": leaf_y["Human"],
"yend": leaf_y["Human"],
"clade": "Hominini",
},
{
"x": branch_data["hominini"],
"xend": leaf_x["Chimpanzee"],
"y": leaf_y["Chimpanzee"],
"yend": leaf_y["Chimpanzee"],
"clade": "Hominini",
},
{
"x": branch_data["hominini"],
"xend": branch_data["hominini"],
"y": leaf_y["Human"],
"yend": leaf_y["Chimpanzee"],
"clade": "Hominini",
},
]
df_segments = pd.DataFrame(segments)
df_leaves = pd.DataFrame({"x": [leaf_x[s] for s in species], "y": [leaf_y[s] for s in species], "species": species})
clade_colors = {
"Root": "#999999",
"Strepsirrhini": IMPRINT[0],
"Haplorrhini": IMPRINT[1],
"Catarrhini": IMPRINT[2],
"Hylobatidae": IMPRINT[3],
"Hominoidea": IMPRINT[4],
"Cercopithecidae": IMPRINT[5],
"Homininae": IMPRINT[6],
"Ponginae": IMPRINT[0],
"Gorillini": IMPRINT[1],
"Hominini": IMPRINT[2],
}
df_segments["color"] = df_segments["clade"].map(clade_colors)
plot = (
ggplot()
+ geom_segment(df_segments, aes(x="x", xend="xend", y="y", yend="yend", color="clade"), size=2.5)
+ geom_point(df_leaves, aes(x="x", y="y"), size=5, color=IMPRINT[0])
+ geom_text(df_leaves, aes(x="x", y="y", label="species"), ha="left", nudge_x=0.02, size=14, color=INK)
+ scale_color_manual(values=clade_colors)
+ annotate("segment", x=0.0, xend=0.1, y=-0.8, yend=-0.8, size=2.5, color=INK_SOFT)
+ annotate("text", x=0.05, y=-1.3, label="0.1 substitutions/site", size=16, color=INK_SOFT)
+ labs(title="tree-phylogenetic · plotnine · anyplot.ai", x="Evolutionary Distance (substitutions per site)")
+ coord_cartesian(xlim=(-0.05, 0.85), ylim=(-1.5, 7.5))
+ theme_void()
+ theme(
figure_size=(16, 9),
plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),
plot_title=element_text(size=24, ha="center", color=INK),
legend_position=(0.88, 0.75),
legend_background=element_rect(fill=PAGE_BG, alpha=0.95),
legend_title=element_text(size=14, color=INK),
legend_text=element_text(size=12, color=INK_SOFT),
legend_key=element_blank(),
plot_margin=0.05,
)
+ labs(color="Clade")
)
plot.save(f"plot-{THEME}.png", dpi=300, verbose=False)
Runnable source as JSON, for any HTTP client: https://api.anyplot.ai/specs/tree-phylogenetic/plotnine/code. Any spec id and library id listed in llms-full.txt fit the same URL shape; every URL below is complete and callable.
{
"spec_id": "tree-phylogenetic",
"language": "python",
"library": "plotnine",
"page": "https://anyplot.ai/tree-phylogenetic/python/plotnine",
"hub": "https://anyplot.ai/tree-phylogenetic",
"code_json": "https://api.anyplot.ai/specs/tree-phylogenetic/plotnine/code",
"spec_json": "https://api.anyplot.ai/specs/tree-phylogenetic",
"render_light_png": "https://storage.googleapis.com/anyplot-images/plots/tree-phylogenetic/python/plotnine/plot-light.png",
"render_dark_png": "https://storage.googleapis.com/anyplot-images/plots/tree-phylogenetic/python/plotnine/plot-dark.png",
"quality_score": 90.0,
"license": "MIT",
"guide": "https://anyplot.ai/llms.txt"
}Part of Phylogenetic Tree Diagram on anyplot.ai.