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

Matplotlib/Seaborn实现X轴上下不同标签的问题求助

Seaborn热力图实现双X轴标签(底部State+顶部分组Sample)

核心思路

通过Matplotlib的双轴(twiny())实现共享X轴的双层标签:底部轴显示拆分后的State类标签,顶部轴仅显示居中对齐的Sample分组标签,两者互不干扰。

完整实现代码

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

# 1. 构造示例数据与标签
np.random.seed(42)
data = np.random.rand(5, 10)  # 5行10列的热力图数据

# 底部X轴:每个列对应的State标签
state_labels = [f'State_{i+1}' for i in range(10)]
# 顶部X轴:分组Sample标签及对应列数(可根据实际数据调整)
sample_groups = [('Sample_A', 3), ('Sample_B', 4), ('Sample_C', 3)]
sample_labels = [name for name, _ in sample_groups]

# 计算每个Sample分组的中心位置(确保标签居中于对应列组上方)
group_positions = []
current_col = 0
for _, col_count in sample_groups:
    # 热力图单元格中心位置为0.5,1.5,...,因此分组中心为起始列+列数/2 -0.5
    center = current_col + col_count/2 - 0.5
    group_positions.append(center)
    current_col += col_count

# 2. 绘制基础热力图
fig, ax = plt.subplots(figsize=(12, 6))
sns.heatmap(data, ax=ax, cmap='viridis', annot=True, fmt='.2f')

# 3. 设置底部X轴(State标签)
ax.set_xticks(np.arange(len(state_labels)) + 0.5)
ax.set_xticklabels(state_labels, rotation=45, ha='right')
ax.set_xlabel('State', fontsize=11)

# 4. 创建顶部共享X轴(Sample分组标签)
ax_top = ax.twiny()
# 隐藏顶部轴的默认刻度线与标签,仅保留自定义分组标签
ax_top.set_xticks([])
ax_top.set_xticklabels([])
# 添加居中的分组标签
ax_top.set_xticks(group_positions)
ax_top.set_xticklabels(sample_labels, fontsize=12, fontweight='bold')
ax_top.set_xlabel('Sample', fontsize=12, fontweight='bold')

# 5. 调整布局避免标签重叠
plt.tight_layout()
plt.show()

关键细节说明

  • 双轴共享:ax.twiny()创建的顶部轴与原轴共享X轴范围,确保分组标签位置与底部列完全对应
  • 分组居中计算:通过列起始位置+列数/2的方式,精准定位每个分组标签的中心位置,匹配热力图单元格的布局
  • 标签隔离:隐藏顶部轴的默认刻度,仅保留自定义分组标签,避免与底部State标签冲突
  • 布局优化:通过rotation和ha参数调整底部标签的显示角度,防止重叠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:34:53