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

修改Matplotlib图表尺寸后Y轴刻度标签值异常问题

问题原因与解决方案

这个问题的核心在于代码执行顺序错误,加上手动设置Y轴刻度标签的方式不够鲁棒,导致图形尺寸调整后标签和刻度不匹配。

为什么会出现数值减半的情况?

你当前的代码逻辑是:

  1. 绘制堆叠图并设置网格
  2. 获取当前Y轴刻度值,除以1000后设置为标签
  3. 调整图形尺寸

问题出在第三步:当你修改fig.set_size_inches(width, height)时,Matplotlib会自动重新计算坐标轴的布局——包括Y轴的刻度数量和位置。比如当图形从width=6缩到width=4时,Y轴可能会显示更多的刻度(比如原来显示0、20000、40000...,现在显示0、10000、20000、30000...),但你之前设置的标签列表还是基于原来的刻度数量生成的。这时候Matplotlib会循环使用现有的标签,导致新的刻度(比如10000)对应了原来的第二个标签(20),看起来就像是数值变成了原来的一半。

正确的解决方法

有两种可靠的方式修复这个问题:

方法1:调整代码执行顺序

把设置图形尺寸的代码放到最前面,确保Matplotlib先确定好布局,再生成对应的刻度标签:

mpl.rcdefaults()
# 先设置图形尺寸
width = 4
height = width/1.6
fig, ax = plt.subplots(figsize=(width, height))

years = [1980, 1990, 2000, 2010, 2020]
data = [ 
    [10000, 11000, 12000, 13000, 11000], 
    [20000, 21000, 31000, 61000, 65000], 
    [0, 10000, 30000, 100000, 90000]
]

ax.stackplot(years, data)
ax.grid(linestyle='--', color='k', alpha=0.15, axis='y')
# 现在获取的刻度是调整尺寸后的正确刻度
ax.set_yticklabels([x / 1000 for x in ax.get_yticks()])

方法2:使用刻度格式化器(更推荐)

手动设置标签的方式不够灵活,一旦布局变化就容易出错。推荐使用FuncFormatter来自动将刻度值转换为你需要的格式,这样不管图形怎么调整,标签都会自动匹配:

import matplotlib.ticker as ticker
mpl.rcdefaults()

width = 4
height = width/1.6
fig, ax = plt.subplots(figsize=(width, height))

years = [1980, 1990, 2000, 2010, 2020]
data = [ 
    [10000, 11000, 12000, 13000, 11000], 
    [20000, 21000, 31000, 61000, 65000], 
    [0, 10000, 30000, 100000, 90000]
]

ax.stackplot(years, data)
ax.grid(linestyle='--', color='k', alpha=0.15, axis='y')
# 使用FuncFormatter自动格式化刻度
ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: f'{x/1000:.0f}'))

这种方式会动态地将每个Y轴刻度值除以1000并显示,完全不用担心图形尺寸变化导致的标签错位问题。

内容的提问来源于stack exchange,提问作者KevL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:15:13