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

