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

如何自动调整matplotlib的subplot_adjust参数使双子图x轴间距均匀

双向条形图x轴刻度间距均匀解决方案

问题根源

左右子图物理宽度一致,但x轴数据范围不同:左侧Lens列最大值约为120,右侧Nums列最大值为156,相同物理宽度承载的数值范围不同,导致右侧刻度更紧凑。

解决思路

让两个子图的宽度与对应x轴的数值范围成正比,保证每单位数值对应的物理宽度完全一致,即可自动实现刻度间距均匀,无需手动调整left、right参数。

具体修改点

  1. 计算两个x轴的最大值,作为子图宽度比例的依据
  2. 创建子图时通过gridspec_kw参数传入width_ratios,按比例分配子图宽度
  3. 移除手动设置右侧x轴刻度标签的错误代码,避免刻度与实际数值错位
  4. 统一设置两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:06:08