将seaborn clustermap添加到其他绘图中

时间:2018-08-12 19:05:25

标签: python python-3.x matplotlib seaborn

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

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返回一个坐标轴,但不支持聚类或颜色注释。

最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

实际上,clustermap和其他一些功能一样,可以创建自己的图形。您无能为力,但是只要可以在轴内创建最终图形中要包含的所有其他内容(例如本例中的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()

enter image description here

对于具有多个图形级功能进行组合的情况,解决方案要复杂得多,例如in this question