我正在使用seaborn.clustermap创建有序热图。我希望能够分别保存树状图和热图。有没有办法把这三个分开。
我创建热图/树状图组合的代码如下。
sns.clustermap(datadissimilarity, method='average', figsize=(40,40))
sns.clustermap
返回一个"clustergrid",其中包含作为"axes"的子地块:g.ax_col_dendrogram
、g.ax_row_dendrogram,
g.ax_heatmap,
g.ax_col_colors,
g.ax_row_colorsand
g.ax_cbar`。
可以使用这些轴来计算所需区域的边界框。另请参阅matplotlib中保存子地块的第二个答案,了解如何组合区域以选择感兴趣的确切区域。
import seaborn as sns; sns.set_theme(color_codes=True)
iris = sns.load_dataset("iris")
species = iris.pop("species")
g = sns.clustermap(iris)
fig = g.fig
for ax, filename in zip([g.ax_col_dendrogram, g.ax_row_dendrogram, g.ax_heatmap],
['col_dendrogram', 'row_dendrogram', 'heatmap']):
extent = ax.get_tightbbox(fig.canvas.renderer).transformed(fig.dpi_scale_trans.inverted())
fig.savefig(f'{filename}.png', bbox_inches=extent)
在对g.savefig()
的调用中,使用bbox_inches=
只能保存图形的一部分。
树状图和热图位于单独的Axes
对象中,您可以使用g.ax_row_dendrogram
、g.ax_col_dendrogram
和g.ax_heatmap
访问这些对象。您可以使用图形变换来获得它们的位置(以英寸为单位(,以传递给bbox_inches
。
iris = sns.load_dataset("iris")
species = iris.pop("species")
g = sns.clustermap(iris)
for ax,name in zip([g.ax_heatmap, g.ax_col_dendrogram, g.ax_row_dendrogram],
['heatmap.png','col_dendrogram.png','row_dendrogram.png']):
bbox = ax.get_window_extent()
inches = g.fig.dpi_scale_trans.inverted().transform_bbox(bbox)
g.savefig(name, bbox_inches=inches)