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
相关产品推荐
相关产品推荐

