Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
import string
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# generate some data
n_groups = 4
n_per_group = 5
n = n_groups * n_per_group
labels = pd.Categorical([x for x in string.ascii_uppercase[:n_groups] for y in range(n_per_group)], ordered=True)
colors = plt.get_cmap('tab10')(labels.codes)
x = pd.DataFrame(pd.get_dummies(labels).values + np.random.random((n, n_groups)), index=labels)
c = x.T.corr()
kws = dict(row_colors=colors, dendrogram_ratio=0.08, cbar_kws=dict(label='correlation'), figsize=(6.1, 6))
# won't work because 'c' is not guaranteed to be ordered by dendrogram order
grid = sns.clustermap(c, mask=np.triu(c) == 0, **kws)
# Option 1:
# # first cluster and get order
grid1 = sns.clustermap(c)
order = grid1.dendrogram_row.reordered_ind
co = c.iloc[order, order]
plt.close(grid1.fig)
# # then, mask lowe halt
grid2 = sns.clustermap(co, mask=np.triu(co) == 0, xticklabels=False, row_cluster=False, **kws)
# # rotate yaxislabels
grid2.ax_heatmap.set_yticklabels(grid2.ax_heatmap.get_yticklabels(), rotation=0)
# Option 2:
# # plot
grid = sns.clustermap(c, xticklabels=False, **kws)
# # remove lower halt, by setting values to nan
mesh = grid.ax_heatmap.get_children()[0]
c[np.triu(c) == 0] = np.nan
mesh.set_array(c)
# # remove row dendrogram
grid.fig.delaxes(grid.ax_row_dendrogram)
# # rotate yaxislabels
grid.ax_heatmap.set_yticklabels(grid.ax_heatmap.get_yticklabels(), rotation=0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment