如何精确指定Matplotlib中y轴左侧宽度且不改变画布总宽度?
精确控制Matplotlib水平条形图Y轴左侧空白宽度
现有Python代码生成的水平条形图中,Y轴左侧存在一段受刻度标签长度影响的空白区域。需求是精确指定该空白宽度,且不受标签长度变化的影响,同时保持绿色画布的总宽度恒定——即左侧空白宽度增加时,灰色绘图区域宽度对应减少,整体画布宽度不变。
原代码如下:
import pandas as pd import matplotlib.pyplot as plt # data data = {"yLabels": [" Ticklabel1", "Ticklabel2", "Ticklabel3"], "Total":[10.3, 7.5, 3.6]} dataFrame = pd.DataFrame(data = data); # figure fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(10,3)) fig.patch.set_facecolor('#bbffbb') # Plot dataFrame.plot.barh(x='yLabels', y='Total', title="", figsize=(10,3), ax=ax) ax.get_legend().remove() ax.yaxis.set_label_text(None); plt.show();
解决方案
核心思路是手动控制坐标轴在画布中的位置,替代Matplotlib自动根据标签调整的逻辑。通过ax.set_position()方法可以直接定义坐标轴的位置比例,实现固定左侧空白宽度的需求:
- 移除
dataFrame.plot.barh()中重复的figsize参数,避免重复设置 - 使用
ax.set_position()设置坐标轴位置,参数格式为[left, bottom, width, height]:left:坐标轴左侧距离画布左侧的比例(范围0-1),直接对应左侧空白的宽度比例width:坐标轴的宽度比例,需保证left + width ≤ 1,确保总画布宽度不变
修改后的完整代码:
import pandas as pd import matplotlib.pyplot as plt # 数据 data = {"yLabels": [" Ticklabel1", "Ticklabel2", "Ticklabel3"], "Total":[10.3, 7.5, 3.6]} dataFrame = pd.DataFrame(data=data) # 创建画布和轴 fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(10, 3)) fig.patch.set_facecolor('#bbffbb') # 绘制水平条形图 dataFrame.plot.barh(x='yLabels', y='Total', title="", ax=ax) ax.get_legend().remove() ax.yaxis.set_label_text(None) # 精确设置坐标轴位置:[左侧比例, 底部比例, 宽度比例, 高度比例] # 示例:左侧空白占15%,绘图区宽度占80%,右侧留5%空白 ax.set_position([0.15, 0.1, 0.8, 0.8]) plt.show()
如果需要像素级精确控制,可以先固定画布DPI,再计算比例值:
比如画布宽度10英寸、DPI设为100时,总宽度为1000像素。若要左侧空白120像素,计算得left = 120 / 1000 = 0.12,对应width可设为0.83(预留5%右侧空白),只需在代码中添加fig.set_dpi(100)即可。
内容的提问来源于stack exchange,提问作者Marc8932
相关产品推荐
相关产品推荐

