我试图将以下两个图放在同一个图上:
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 返回一个轴,但它不支持聚类或颜色注释。
最好的方法是什么?
确实,
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()
对于具有多个图形级函数来组合解决方案的情况要复杂得多,例如在这个问题中。
如果热图和
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