如何自动调整matplotlib的subplot_adjust参数使双子图x轴间距均匀
双向条形图x轴刻度间距均匀解决方案
问题根源
左右子图物理宽度一致,但x轴数据范围不同:左侧Lens列最大值约为120,右侧Nums列最大值为156,相同物理宽度承载的数值范围不同,导致右侧刻度更紧凑。
解决思路
让两个子图的宽度与对应x轴的数值范围成正比,保证每单位数值对应的物理宽度完全一致,即可自动实现刻度间距均匀,无需手动调整left、right参数。
具体修改点
- 计算两个x轴的最大值,作为子图宽度比例的依据
- 创建子图时通过
gridspec_kw参数传入width_ratios,按比例分配子图宽度 - 移除手动设置右侧x轴刻度标签的错误代码,避免刻度与实际数值错位
- 统一设置两个x轴的刻度间隔,保证显示一致性
修改后完整代码
import matplotlib.pyplot as plt import matplotlib as mpl import pandas as pd import seaborn as sns sns.set() %matplotlib notebook Class = ['test1', 'test2', 'test3', 'test4', 'test5', 'test6', 'test7'] Lens = [111, 80, 114, 59, 109.0491744186047, 117, 120] Nums = [124, 28, 22, 41, 85, 33, 156] data = pd.DataFrame(data=zip(Class,Lens,Nums),columns=['Class','Lens','Nums']) data.set_index('Class', inplace=True) font_color = '#525252' hfont = {'fontname':'Calibri'} color_red = '#fd625e' color_blue = '#01b8aa' index = data.index column0 = data['Lens'] column1 = data['Nums'] title0 = "Title 1" title1 = 'Title 2' # 计算两个x轴的最大值,设置子图宽度比例 max_lens = column0.max() max_nums = column1.max() # 创建子图时传入width_ratios按比例分配宽度 fig, axes = plt.subplots(figsize=(10,5), ncols=2, sharey=True, gridspec_kw={'width_ratios': [max_lens, max_nums]}) fig.tight_layout() fig.canvas.set_window_title('test') axes[0].barh(index, column0, align='center', color=color_red, zorder=10) axes[0].set_title(title0, fontsize=18, pad=15, color=color_red, **hfont) axes[1].barh(index, column1, align='center', color=color_blue, zorder=10) axes[1].set_title(title1, fontsize=18, pad=15, color=color_blue, **hfont) axes[0].invert_xaxis() plt.gca().invert_yaxis() axes[0].grid(False) axes[1].grid(False) axes[0].set_facecolor('white') axes[1].set_facecolor('white') axes[0].set(yticks=data.index, yticklabels=data.index) axes[0].yaxis.tick_left() axes[0].tick_params(axis='y', colors='white') # 统一两个x轴的刻度间隔为20,保证显示一致 axes[0].xaxis.set_major_locator(mpl.ticker.MultipleLocator(20)) axes[1].xaxis.set_major_locator(mpl.ticker.MultipleLocator(20)) for label in (axes[0].get_xticklabels() + axes[0].get_yticklabels()): label.set(fontsize=13, color=font_color, **hfont) for label in (axes[1].get_xticklabels() + axes[1].get_yticklabels()): label.set(fontsize=13, color=font_color, **hfont) plt.subplots_adjust(wspace=0, top=0.85, bottom=0.1, left=0.18, right=0.95) plt.show()
效果说明
修改后两个x轴相同数值差对应的刻度间距完全相等,完全不需要手动调整边距参数即可实现精度一致的均匀刻度。
内容的提问来源于stack exchange,提问作者Slowat_Kela
相关产品推荐
相关产品推荐

