有两种选择:
First, heatmap
是一个轴级别图,因此您可以为相关矩阵设置一个主要的大型主热图轴,并在其侧面使用热图,然后将类颜色传递给自己。这将需要一些工作,但可以让您更好地控制一切的运作方式。
这或多或少是一个选择clustermap
不过,所以我将在这里演示如何做到这一点。这有点麻烦,但它会起作用。
首先,我们将加载示例数据并进行一些迂回转换以获取类标签的颜色。
networks = sns.load_dataset("brain_networks", index_col=0, header=[0, 1, 2])
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))
network_colors = pd.Series(network_labels).map(network_lut)
接下来我们调用clustermap
来制作主线剧情。
g = sns.clustermap(networks.corr(),
# Turn off the clustering
row_cluster=False, col_cluster=False,
# Add colored class labels
row_colors=network_colors, col_colors=network_colors,
# Make the plot look better when many rows/cols
linewidths=0, xticklabels=False, yticklabels=False)
侧面颜色是用热图绘制的,matplotlib 将其视为定量数据,因此没有直接的方法可以直接从中获取图例。相反,我们将添加一个具有正确颜色和标签的不可见条形图,然后添加一个图例that.
for label in network_labels.unique():
g.ax_col_dendrogram.bar(0, 0, color=network_lut[label],
label=label, linewidth=0)
g.ax_col_dendrogram.legend(loc="center", ncol=6)
最后,让我们移动颜色条以占据行树状图通常所在的空白区域并保存图形。
g.cax.set_position([.15, .2, .03, .45])
g.savefig("clustermap.png")