如何在seaborn中实现共享y轴的标签居中对齐
Seaborn共享y轴水平条形图标签居中实现方案
核心实现思路
- 现有代码重复给两个子图设置y轴刻度标签属于冗余操作,由于两个子图开启了
sharey=True,仅需要在显示刻度的轴上配置一次标签即可 - 左图设置
yaxis.tick_right()后,y轴刻度正好落在两个子图的拼接分界线上,默认标签为左对齐,会整体偏移到右图区域内,只需要修改标签对齐方式和位置参数即可实现居中 - 不需要额外新增中间轴或者复杂的坐标转换,直接通过matplotlib原生的标签属性配置就能实现效果,性能开销最低
优化后完整代码
import seaborn as sns import matplotlib.pyplot as plt import numpy as np import string import random # 生成测试数据 可替换为实际业务数据 random.seed(42) labels = [] for i in range(10): labels.append(''.join(random.choices(string.ascii_lowercase, k=4))) labels.append(''.join(random.choices(string.ascii_lowercase, k=7))) score = np.abs(np.random.randn(20)) fig, axes = plt.subplots(1, 2, figsize=(5, 5), sharey=True) for idx, ax in enumerate(axes): # 直接传入range对象生成y轴位置,省略冗余列表推导 sns.barplot(y=range(len(score)), x=score, ax=ax, orient='h') if idx == 0: ax.invert_xaxis() ax.yaxis.tick_right() # 核心配置:设置标签水平居中,位置锚定在两图分界的轴脊处 ax.set_yticklabels(labels, ha='center', x=0) fig.tight_layout(w_pad=0, pad=1) plt.show()
关键参数说明
ha='center':将y轴刻度标签的水平对齐方式从默认的左对齐修改为居中对齐x=0:指定标签在y轴局部坐标系中的水平位置为轴脊所在位置(即两个子图的拼接分界线),配合居中对齐让标签中心正好落在两图中间,不会偏向任意一侧- 代码中添加了随机种子保证测试结果可复现,简化了冗余的列表推导写法,运行效率更高
内容的提问来源于stack exchange,提问作者Berk
相关产品推荐
相关产品推荐

