Matplotlib Subplot2Grid共享轴后无法控制轴刻度标签问题
解决方案:共享轴下独立控制刻度标签显示
共享轴时,set_xticklabels()/set_yticklabels()会同步修改所有绑定的共享轴刻度内容,这是你遇到问题的核心原因。正确做法是通过tick_params()控制单轴的刻度标签显示状态,而非修改刻度内容。
一、处理柱状图的X轴刻度标签
只保留最后一个柱状图(ax4)的X轴刻度标签,隐藏前三个(ax1、ax2、ax3)的标签:
# 前三个柱状图隐藏X轴刻度标签 ax1.tick_params(labelbottom=False) ax2.tick_params(labelbottom=False) ax3.tick_params(labelbottom=False) # 最后一个柱状图正常设置X轴标签(保留你的原有代码) ax4.set_xticks(np.arange(len(df_bars))) ax4.set_xticklabels(df_bars['Reach Number'])
二、处理散点图的Y轴刻度标签
只保留最左侧散点图(ax5)的Y轴刻度标签,隐藏右侧两个(ax6、ax7)的标签:
# 右侧两个散点图隐藏Y轴刻度标签 ax6.tick_params(labelleft=False) ax7.tick_params(labelleft=False) # ax5正常设置Y轴标签(按需添加) # ax5.set_ylabel('散点图Y轴标签')
修改后的完整代码片段(关键部分)
# figure setup fig = plt.figure() fig.set_figheight(15) fig.set_figwidth(9) ax1 = plt.subplot2grid(shape=(6, 3), loc=(0, 0), colspan=3) ax2 = plt.subplot2grid(shape=(6, 3), loc=(1, 0), colspan=3, sharex=ax1) ax3 = plt.subplot2grid(shape=(6, 3), loc=(2, 0), colspan=3, sharex=ax1) ax4 = plt.subplot2grid(shape=(6, 3), loc=(3, 0), colspan=3, sharex=ax1) ax5 = plt.subplot2grid(shape=(6, 3), loc=(5, 0)) ax6 = plt.subplot2grid(shape=(6, 3), loc=(5, 1), sharex=ax5, sharey=ax5) ax7 = plt.subplot2grid(shape=(6, 3), loc=(5, 2), sharex=ax5, sharey=ax5) # plotting bars here # first bar plot ax1.set_title('Inundation area') ylbl0 = 'Inundation area \n' + r'$(km^2)$' ax1.set_ylabel(ylbl0) ax1.tick_params(labelbottom=False) # 新增:隐藏X轴标签 # 处理ax2、ax3 ax2.set_title('第二个柱状图标题') ax2.set_ylabel('对应Y轴标签') ax2.tick_params(labelbottom=False) # 新增:隐藏X轴标签 ax3.set_title('第三个柱状图标题') ax3.set_ylabel('对应Y轴标签') ax3.tick_params(labelbottom=False) # 新增:隐藏X轴标签 # last bar plot ax4.set_title(r'$\Delta$ Shear Stress') ax4.set_xticks(np.arange(len(df_bars))) ax4.set_xticklabels(df_bars['Reach Number']) ax4.invert_xaxis() ax4.axhline(y=0,c='k',lw = 0.5) ax4.set_xlabel('Reach number') ax4.set_ylabel('% change \n (2019-2020)') # 处理散点图 # ax5.scatter(...) ax5.set_ylabel('散点图Y轴标签') # ax6.scatter(...) ax6.tick_params(labelleft=False) # 隐藏Y轴标签 # ax7.scatter(...) ax7.tick_params(labelleft=False) # 隐藏Y轴标签
原理说明
tick_params(labelbottom=False):仅修改当前轴的刻度标签显示状态,不会影响共享轴的其他子图,因为它操作的是轴的显示属性,而非刻度本身的内容。set_xticklabels('')会直接修改共享轴的刻度文本内容,导致所有绑定的轴同步变化,这就是你之前操作失效的原因。
内容的提问来源于stack exchange,提问作者CraigMacDonellGlasgow
相关产品推荐
相关产品推荐

