Python 如何在Seaborn中表示热图轴上的类

Python 如何在Seaborn中表示热图轴上的类,python,matplotlib,heatmap,seaborn,Python,Matplotlib,Heatmap,Seaborn,我创建了一个非常简单的热图,Seaborn显示了一个相似的方形矩阵。下面是我使用的一行代码: sns.heatmap(sim_mat, linewidths=0, square=True, robust=True) sns.plt.show() 这是我得到的输出: 我想做的不是在x轴和y轴上表示实例的标签,而是一个彩色指示器(想象一下每个轴上有一个小的帕尔普洛特),其中每个颜色表示与每个实例相关的另一个变量(假设我将此信息存储在名为labels的列表中)在指定热图颜色的图例旁边加上另一个此类

我创建了一个非常简单的热图,Seaborn显示了一个相似的方形矩阵。下面是我使用的一行代码:

sns.heatmap(sim_mat, linewidths=0, square=True, robust=True)
sns.plt.show()
这是我得到的输出:

我想做的不是在x轴和y轴上表示实例的标签,而是一个彩色指示器(想象一下每个轴上有一个小的帕尔普洛特),其中每个颜色表示与每个实例相关的另一个变量(假设我将此信息存储在名为
labels
的列表中)在指定热图颜色的图例旁边加上另一个此类信息的图例(类似于
lmplot
)。重要的是,这两个信息具有不同的调色板

这在Seaborn可能吗

更新

我要找的是正确建议的
clustermap

sns.clustermap(sim_mat, row_colors=label_cols, col_colors=label_cols
    row_cluster=False, col_cluster=False)
这里是我得到的顺便说一句,点和线太小,我没有看到一种方法来扩大他们在文档中。我想

另外,我如何添加图例并将两个图例相邻放置在同一位置

有两种选择:

首先,
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认为热图是定量数据,因此没有直接从热图中获取图例的简单方法。相反,我们将添加一个具有正确颜色和标签的不可见条形图,然后为其添加图例

最后,让我们移动颜色条以占据行树状图通常所在的空白空间,并保存图形

g.cax.set_position([.15, .2, .03, .45])
g.savefig("clustermap.png")

基于,我认为值得注意的是,标签可能有多种颜色级别,如clustermap文档({row,col}\u colors)中所述。我找不到多个级别的示例,所以我想在这里分享一个示例

networks = sns.load_dataset("brain_networks", index_col=0, header=[0, 1, 2])
网络级 使用网络的列创建索引 节点级 使用节点的列创建索引 为行和列颜色级别创建数据框 创建
clustermap
创建两个图例-通过创建不可见的列和行条形图(如上所述),每个级别一个图例 网络传奇 节点图例

使用两个树状图时,还可以添加新的隐藏轴并绘制图例

ax= f.add_axes((0,0,0,0))
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)

for label in node_labels.unique():
    ax.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=f.transFigure)

听起来您可能想在侧边颜色和群集关闭的情况下使用
clusterplot
。看这个例子。这正是我今天想要的。这是我遇到的最有用的答案之一;我自己永远也不会明白这一点。非常感谢。
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, index=networks.columns).map(network_lut)
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))
node_colors = pd.Series(node_labels, index=networks.columns).map(node_lut)
network_node_colors = pd.DataFrame(network_colors).join(pd.DataFrame(node_colors))
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")
from matplotlib.pyplot import gcf

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)
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()
ax= f.add_axes((0,0,0,0))
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)

for label in node_labels.unique():
    ax.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=f.transFigure)