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

matplotlib子图横向柱状图标注偏移、边框自定义及坐标轴刻度设置问题

问题1:单独调整特定标注的位置

可以在标注遍历循环中加判断规则,既可针对Fullerton单独调整,也可通用处理所有负分值柱子的标注位置:

for rect, label in zip(S, S_presidents):
    width = rect.get_width()
    label_y_pos = rect.get_y() + rect.get_height() / 2
    # 单独匹配Fullerton,也可通用判断分值为负的所有柱子
    if label == 'Fullerton' or width < 0:
        # 负分柱子向左延伸,标注放在柱子左侧,设置右对齐避免遮挡
        axes[1].text(width - 2, label_y_pos, s=label, color='blue', ha='right')
    else:
        axes[1].text(width + 2, label_y_pos, s=label, color='blue')

A子图的标注循环也可套用相同逻辑处理。

问题2:仅保留x轴线

不要使用frame_on=False关闭全部边框,单独隐藏不需要的边框即可,x轴对应底部spine:

# 替换原有axes[0].set(frame_on=False)代码
axes[0].spines[['top', 'right', 'left']].set_visible(False)
# 替换原有axes[1].set(frame_on=False)代码
axes[1].spines[['top', 'right', 'left']].set_visible(False)

问题3:年份数值显示在y轴刻度中间

barh的align='center'参数已经保证柱子中心和y轴刻度对齐,仅需要调整刻度标签的垂直对齐规则即可:

# 放在子图属性设置部分即可
axes[1].yaxis.set_tick_params(va='center')

问题4:显示2000-2020全部年份刻度

因为你设置了sharey=True两个子图共享y轴,仅需要对任意一个子图设置刻度即可,同时建议调整y轴范围让柱子显示更整齐:

# 放在子图属性设置部分,比如设置ylabel之后
axes[1].set_yticks(Years)
axes[1].set_ylim(1999.5, 2020.5)

另外补充代码修正提示:你现有代码导入了statsmodels.api as sm,但后续使用的theilslopes属于scipy.stats模块,需要补充导入from scipy import stats否则会触发报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:54:02