Based on the answer above , I think it's worth noting the possibility of using multiple color levels for labels - as noted in the clustermap docs ({row, col} _colors). I could not find an example of several levels, so I decided to share an example here.
networks = sns.load_dataset("brain_networks", index_col=0, header=[0, 1, 2])
network layer
network_labels = networks.columns.get_level_values("network") network_pal = sns.cubehelix_palette(network_labels.unique().size, light=.9, dark=.1, reverse=True, start=1, rot=-2) network_lut = dict(zip(map(str, network_labels.unique()), network_pal))
Create an index using columns for networks
network_colors = pd.Series(network_labels, index=networks.columns).map(network_lut)
node level
node_labels = networks.columns.get_level_values("node") node_pal = sns.cubehelix_palette(node_labels.unique().size) node_lut = dict(zip(map(str, node_labels.unique()), node_pal))
Create an index using columns for nodes
node_colors = pd.Series(node_labels, index=networks.columns).map(node_lut)
Create a data frame for row and column color levels
network_node_colors = pd.DataFrame(network_colors).join(pd.DataFrame(node_colors))
create clustermap
g = sns.clustermap(networks.corr(), # Turn off the clustering row_cluster=False, col_cluster=False, # Add colored class labels using data frame created from node and network colors row_colors = network_node_colors, col_colors = network_node_colors, # Make the plot look better when many rows/cols linewidths=0, xticklabels=False, yticklabels=False, center=0, cmap="vlag")
create two legends - one for each level, creating invisible columns and row columns (as indicated above)
network legend
for label in network_labels.unique(): g.ax_col_dendrogram.bar(0, 0, color=network_lut[label], label=label, linewidth=0) l1 = g.ax_col_dendrogram.legend(title='Network', loc="center", ncol=5, bbox_to_anchor=(0.47, 0.8), bbox_transform=gcf().transFigure)
node legend
for label in node_labels.unique(): g.ax_row_dendrogram.bar(0, 0, color=node_lut[label], label=label, linewidth=0) l2 = g.ax_row_dendrogram.legend(title='Node', loc="center", ncol=2, bbox_to_anchor=(0.8, 0.8), bbox_transform=gcf().transFigure) plt.show()
