You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整Clustermap上方Lineplot的尺寸以适配组合图?

解决Seaborn Clustermap上方添加折线图的尺寸适配问题

问题场景

使用seaborn.clustermap生成聚类热图后,通过fig.subplots_adjust(top=0.5)将热图移至画布下半部分,想要在上方绘制关联数据的折线图,但常规调整尺寸的方法(如修改画布尺寸、传入figsize/height/aspect等参数)均无效,需要让折线图的宽高比适配整个组合图,且优先使用Seaborn绘制折线图。

当前代码的核心问题:手动指定add_axes([0.05, 0.05, 0.4, 0.9])的固定位置参数,无法与热图的尺寸自动对齐,导致折线图尺寸与热图不匹配,甚至出现布局重叠。

解决方案

核心思路是动态获取聚类热图的轴位置信息,以此为基准设置折线图的轴位置,确保两者宽度对齐,高度适配上方预留的空间。具体步骤如下:

  1. 获取clustermap中热图区域的位置边界(bbox)
  2. 基于该边界,设置折线图的轴位置,使其宽度与热图一致,高度占满上方预留空间

修改后代码

import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 加载数据并生成聚类热图
iris = sns.load_dataset("iris")
species = iris.pop("species")
g = sns.clustermap(iris)

# 设置画布整体尺寸
g.fig.set_size_inches(20, 10)
# 调整布局,为上方折线图预留空间(top=0.5表示热图区域顶部在画布50%高度位置)
g.fig.subplots_adjust(top=0.5)

# 获取热图轴的位置边界
heatmap_pos = g.ax_heatmap.get_position()

# 添加折线图的轴:宽度与热图一致,高度占上方预留空间(留少量边距避免贴边)
ax_line = g.fig.add_axes([
    heatmap_pos.x0,        # 与热图左对齐
    0.5,                   # 折线图底部对应热图顶部的预留位置
    heatmap_pos.width,     # 与热图同宽
    0.45                   # 折线图高度(0.95-0.5=0.45,顶部留0.05边距)
])

# 生成示例折线图数据并绘制
rand_melt = pd.melt(pd.DataFrame(np.random.randn(1000).cumsum()))
sns.lineplot(x=rand_melt.index, y="value", data=rand_melt, ax=ax_line)

# 可选:优化折线图标注
ax_line.set_title("关联数据折线图")
ax_line.set_xlabel("样本索引")
ax_line.set_ylabel("累计值")

plt.show()

关键说明

  • 动态获取g.ax_heatmap.get_position()可以自动适配热图的位置变化(比如不同数据导致热图尺寸调整),避免手动固定数值的局限性
  • add_axes的参数格式为[left, bottom, width, height],所有值都是相对于画布的比例(范围0-1),确保画布尺寸调整时布局依然适配
  • 若需调整折线图的上下边距,只需修改0.5(底部位置)和0.45(高度)的数值,保证两者之和不超过1即可

内容的提问来源于stack exchange,提问作者Whitehot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 14:21:31