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

如何精确指定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()方法可以直接定义坐标轴的位置比例,实现固定左侧空白宽度的需求:

  1. 移除dataFrame.plot.barh()中重复的figsize参数,避免重复设置
  2. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:15:32