作者:宅囧2502881733 | 来源:互联网 | 2023-05-26 14:05
我创建了一个非常简单的热图图表,Seaborn显示了相似性方阵.这是我使用的一行代码:
sns.heatmap(sim_mat, linewidths=0, square=True, robust=True)
sns.plt.show()
这是我得到的输出:
我想做的是在x和y轴上表示不是我的实例的标签而是一个彩色指示器(想象每个轴上的一个小的palplot),其中每种颜色代表与每个实例相关的另一个变量(让我们说我有这个信息存储了一个名为的列表labels
加上另一个图例,这个信息旁边的那个信息指定了热图的颜色(一个像那样lmplot
).重要的是这两种信息具有不同的调色板.
Seaborn有可能吗?
UPDATE
我正在寻找的是clustermap
正确的建议.
sns.clustermap(sim_mat, row_colors=label_cols, col_colors=label_cols
row_cluster=False, col_cluster=False)
这是我得到的顺序,点和线太小,我没有看到在文档中放大它们的方法.我想
另外,如何添加图例并将两个图例放在另一个图例的相同位置?
1> mwaskom..:
有两种选择:
首先,heatmap
是一个Axes级别的数字,因此您可以为相关矩阵设置一个主要的大型主热图轴,并在其后面加上热图,然后将类颜色传递给自己.这将是一些工作,但让你可以控制一切的工作方式.
这或多或少是一个选项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认为它是定量数据,因此没有直接从中获取图例的直接方法.取而代之的是,我们将添加一个不可见的barplot用正确的颜色和标签,然后添加一个传奇的那个.
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")