Dendrogram
Polar Phylogenetic Tree Dark
Real polar dendrogram for phylogenetic analysis with proper scipy transformation
Output
Python
import matplotlib.pyplot as plt
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage, set_link_color_palette
np.random.seed(123)
species = ['Human', 'Chimp', 'Gorilla', 'Orangutan', 'Macaque', 'Mouse',
'Rat', 'Dog', 'Cat', 'Cow', 'Pig', 'Horse']
n = len(species)
genetic_data = np.random.rand(n, 6) * 50
Z = linkage(genetic_data, method='average')
fig_temp, ax_temp = plt.subplots()
set_link_color_palette(['#27D3F5', '#F5276C', '#6CF527', '#F5B027', '#5314E6'])
dn = dendrogram(Z, labels=species, no_plot=False, color_threshold=0.6*max(Z[:,2]),
above_threshold_color='#666666', ax=ax_temp)
plt.close(fig_temp)
icoord = np.array(dn['icoord'])
dcoord = np.array(dn['dcoord'])
colors = dn['color_list']
x_min, x_max = icoord.min(), icoord.max()
y_max = dcoord.max()
def to_polar(x, y):
theta = (x - x_min) / (x_max - x_min) * 2 * np.pi * 0.92 + np.pi * 0.04
r = y / y_max * 0.65 + 0.3
return theta, r
fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={'projection': 'polar'}, facecolor='#0a0a0f')
ax.set_facecolor('#0a0a0f')
for ic, dc, color in zip(icoord, dcoord, colors):
thetas, rs = [], []
for x, y in zip(ic, dc):
t, r = to_polar(x, y)
thetas.append(t)
rs.append(r)
# Glow effect
for lw, alpha in [(4, 0.15), (2, 0.9)]:
ax.plot([thetas[0], thetas[1]], [rs[0], rs[1]], color=color, linewidth=lw, alpha=alpha)
ax.plot([thetas[2], thetas[3]], [rs[2], rs[3]], color=color, linewidth=lw, alpha=alpha)
if thetas[1] != thetas[2]:
arc_thetas = np.linspace(min(thetas[1], thetas[2]), max(thetas[1], thetas[2]), 40)
ax.plot(arc_thetas, [rs[1]]*len(arc_thetas), color=color, linewidth=lw, alpha=alpha)
leaf_positions = np.linspace(x_min, x_max, n)
for i, (pos, label) in enumerate(zip(leaf_positions, dn['ivl'])):
theta, _ = to_polar(pos, 0)
rotation = np.degrees(theta) - 90 if np.pi/2 < theta < 3*np.pi/2 else np.degrees(theta) + 90
ha = 'right' if np.pi/2 < theta < 3*np.pi/2 else 'left'
ax.text(theta, 0.2, label, ha=ha, va='center', fontsize=9, color='#27D3F5',
rotation=rotation, rotation_mode='anchor', fontweight='500')
color = ['#27D3F5', '#F5276C', '#6CF527', '#F5B027', '#5314E6'][i % 5]
ax.scatter(theta, 0.3, c=color, s=50, zorder=5, edgecolor='white', linewidth=0.5)
ax.set_ylim(0, 1.05)
ax.set_yticklabels([])
ax.set_xticklabels([])
ax.spines['polar'].set_visible(False)
ax.grid(True, color='#1a1a3f', alpha=0.4)
ax.set_title('Phylogenetic Circular Tree', fontsize=14, color='white', fontweight='bold', y=1.08)
plt.tight_layout()
plt.show()
Library
Matplotlib
Category
Statistical
More Dendrogram examples
☕