如何在热力图右侧添加自定义Y轴刻度?
问题
现有基于Seaborn和Pandas的热力图代码,生成的图表仅左侧显示Y轴刻度,需要在右侧添加自定义Y轴刻度,尝试tick_params方法只能复用左侧刻度,求可行实现方案。
原代码如下:
data = { 'q1': [6, 4, 4, 4, 6, 6, 6, 4, 6, 6, 6, 6], 'q2': [3, 3, 3, 4, 3, 3, 4, 3, 4, 3, 4, 1], 'q3': [6, 3, 4, 4, 4, 4, 6, 6, 6, 6, 4, 1], 'q4': [3, 6, 6, 6, 6, 6, 4, 4, 6, 4, 6, 4], 'q5': [4, 3, 3, 3, 3, 6, 6, 4, 4, 6, 3, 4], 'q6': [3, 3, 4, 4, 6, 3, 3, 1, 6, 4, 4, 4], 'q7': [4, 3, 3, 3, 3, 6, 4, 1, 4, 1, 4, 1], 'q8': [4, 4, 1, 6, 4, 6, 4, 1, 6, 1, 4, 1], 'q9': [4, 6, 4, 3, 4, 3, 4, 6, 6, 4, 3, 4], 'q10': [3, 4, 1, 3, 4, 3, 3, 6, 6, 3, 4, 4] } import seaborn as sns import pandas as pd df = pd.DataFrame(data) cm = sns.heatmap(df.T, annot=False, cbar=True) cm.get_figure().savefig('heatmap.pdf')
解决方案
通过创建共享X轴的副轴(twinx())实现右侧自定义Y轴刻度,步骤如下:
- 生成热力图后,用
twinx()创建副轴,共享原轴的X轴 - 对齐副轴与原轴的Y轴范围,保证刻度位置匹配
- 设置副轴的Y轴刻度位置和自定义标签
修改后的完整代码:
data = { 'q1': [6, 4, 4, 4, 6, 6, 6, 4, 6, 6, 6, 6], 'q2': [3, 3, 3, 4, 3, 3, 4, 3, 4, 3, 4, 1], 'q3': [6, 3, 4, 4, 4, 4, 6, 6, 6, 6, 4, 1], 'q4': [3, 6, 6, 6, 6, 6, 4, 4, 6, 4, 6, 4], 'q5': [4, 3, 3, 3, 3, 6, 6, 4, 4, 6, 3, 4], 'q6': [3, 3, 4, 4, 6, 3, 3, 1, 6, 4, 4, 4], 'q7': [4, 3, 3, 3, 3, 6, 4, 1, 4, 1, 4, 1], 'q8': [4, 4, 1, 6, 4, 6, 4, 1, 6, 1, 4, 1], 'q9': [4, 6, 4, 3, 4, 3, 4, 6, 6, 4, 3, 4], 'q10': [3, 4, 1, 3, 4, 3, 3, 6, 6, 3, 4, 4] } import seaborn as sns import pandas as pd df = pd.DataFrame(data) # 生成热力图 cm = sns.heatmap(df.T, annot=False, cbar=True) # 创建共享X轴的副轴 ax2 = cm.twinx() # 自定义右侧Y轴标签,可替换为任意需要的内容 custom_labels = ['问题1', '问题2', '问题3', '问题4', '问题5', '问题6', '问题7', '问题8', '问题9', '问题10'] # 设置副轴Y轴刻度位置与原轴一致 ax2.set_yticks(range(len(df.columns))) # 设置自定义刻度标签 ax2.set_yticklabels(custom_labels) # 对齐副轴与原轴的Y轴范围,避免刻度位置偏移 ax2.set_ylim(cm.get_ylim()) # 可选:隐藏副轴右侧边框,优化视觉效果 ax2.spines['right'].set_visible(False) # 保存图表 cm.get_figure().savefig('heatmap_with_right_ticks.pdf')
关键说明
twinx()创建的副轴与原热力图轴共享X轴,Y轴独立,支持完全自定义刻度- 必须通过
set_ylim()对齐两个轴的Y范围,否则自定义刻度会出现位置偏移 - 可根据需求调整自定义标签的内容、字体大小、颜色等样式
内容的提问来源于stack exchange,提问作者Kar
相关产品推荐
相关产品推荐

