添加seaborn clustermap以与其他图一起绘制

问题描述 投票:0回答:2

我试图将以下两个图放在同一个图上:

import seaborn as sns; sns.set(color_codes=True)
import matplotlib.pyplot as plt
f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
iris = sns.load_dataset("iris")
sns.boxplot(data=iris, orient="h", palette="Set2", ax = ax1)
species = iris.pop("species")
lut = dict(zip(species.unique(), "rbg"))
row_colors = species.map(lut)
sns.clustermap(iris, row_colors=row_colors, ax = ax2)

我知道 clustermap 返回一个数字,所以这不起作用。但是,我仍然需要一种方法来将这些图彼此相邻(水平)呈现。 sns.heatmap 返回一个轴,但它不支持聚类或颜色注释。

最好的方法是什么?

python python-3.x matplotlib seaborn
2个回答
10
投票

确实,

clustermap
与其他一些seaborn函数一样,创建了自己的图形。您对此无能为力,但只要您想要在最终图形中拥有的所有其他内容都可以在轴内创建,就像本例中的
boxplot
一样,解决方案相对简单。

您可以简单地使用

clustermap
为您创建的图形。然后,我们的想法是操纵轴的网格规格,以便为其他轴留下一些位置。

import seaborn as sns; sns.set(color_codes=True)
import matplotlib.pyplot as plt
import matplotlib.gridspec

iris = sns.load_dataset("iris")
species = iris.pop("species")

lut = dict(zip(species.unique(), "rbg"))
row_colors = species.map(lut)

#First create the clustermap figure
g = sns.clustermap(iris, row_colors=row_colors, figsize=(13,8))
# set the gridspec to only cover half of the figure
g.gs.update(left=0.05, right=0.45)

#create new gridspec for the right part
gs2 = matplotlib.gridspec.GridSpec(1,1, left=0.6)
# create axes within this new gridspec
ax2 = g.fig.add_subplot(gs2[0])
# plot boxplot in the new axes
sns.boxplot(data=iris, orient="h", palette="Set2", ax = ax2)
plt.show()

对于具有多个图形级函数来组合解决方案的情况要复杂得多,例如在这个问题中


0
投票

如果热图和

ax2
应对齐,请执行以下操作:

import seaborn as sns; sns.set(color_codes=True)
import matplotlib.pyplot as plt
import matplotlib.gridspec

iris = sns.load_dataset("iris")
species = iris.pop("species")

lut = dict(zip(species.unique(), "rbg"))
row_colors = species.map(lut)

#First create the clustermap figure
g = sns.clustermap(iris, row_colors=row_colors, figsize=(13,8))
# set the gridspec to only cover half of the figure
g.gs.update(left=0.05, right=0.45)

#create new gridspec for the right part
gs2 = matplotlib.gridspec.GridSpec(1, 1)
# create axes within this new gridspec
ax2 = g.fig.add_subplot(gs2[0])

# get position of heatmap
heatmap_bbox = g.ax_heatmap.get_position()
ax2.set_position([0.6, heatmap_bbox.y0, .35, heatmap_bbox.height])

# plot boxplot in the new axes
sns.boxplot(data=iris, orient="h", palette="Set2", ax = ax2)
plt.savefig('stack.svg')

[![第二个图与热图垂直对齐][1]][1] [1]:https://i.stack.imgur.com/ekWqb.png

© www.soinside.com 2019 - 2024. All rights reserved.