You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

matplotlib savefig无法正确保存全屏显示绘图问题求助

解决Matplotlib最大化显示后保存图像与显示不一致的问题

我明白你遇到的问题了——当你把绘图窗口最大化后,保存的图像尺寸远小于显示的大小,但字体和线宽又正常,调DPI只会让字体过大。这其实是因为matplotlib的figure尺寸在窗口最大化后并没有即时更新,保存时用的还是初始化的默认尺寸,导致整体图像偏小,但字体、线宽的比例是匹配这个小尺寸的,所以调整DPI只会让元素按比例变大,无法解决整体尺寸的问题。

问题根源

你当前代码里的figManager.window.showMaximized()只是让窗口显示状态变为最大化,但matplotlib的fig对象本身的尺寸(figsize)还是创建时的默认值(比如6.4x4.8英寸)。savefig时基于这个小尺寸乘以DPI生成图像,自然整体偏小,但字体、线宽是按这个尺寸+DPI计算的,所以看起来正常。

修改后的代码

下面是调整后的代码,能让保存的图像在整体尺寸、字体大小、线宽上和显示的完全一致:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0,10,0.01)
y1 = np.sin(x)
y2 = np.sin(3*x)
y3 = np.sin(5*x)

fig, ax = plt.subplots()
figManager = plt.get_current_fig_manager()
figManager.window.showMaximized()

# 关键步骤:先显示窗口并等待后端更新尺寸
plt.show(block=False)
# 给Qt后端一点时间完成窗口渲染,确保尺寸已更新
plt.pause(0.1)

# 将窗口的像素尺寸转换为matplotlib用的英寸尺寸(除以DPI)
win_width, win_height = figManager.window.width(), figManager.window.height()
dpi = fig.dpi
fig.set_size_inches(win_width / dpi, win_height / dpi)

# 你的原有绘图和布局设置
plt.subplots_adjust(bottom=0.09, top=0.96, right=0.97, left=0.07)
plt.plot(x,y1, 'C0', linewidth = 2)
plt.plot(x,y2, 'C1', linewidth = 2)
plt.plot(x,y3, 'C2', linewidth = 2)
plt.xlabel('x label', fontsize=18)
plt.ylabel('y label', fontsize=18)
plt.xticks(color='k', size=16)
plt.yticks(color='k', size=16)
plt.grid()
plt.legend(['blue', 'red', 'green'], fontsize=16)

# 保存图像,使用当前figure的DPI即可
fig.savefig('coco_maximized.png', dpi=dpi, bbox_inches='tight')

# 继续显示窗口(如果需要)
plt.show()

核心调整说明

  • plt.show(block=False):让窗口显示但不阻塞代码执行,这样后续能获取到窗口最大化后的真实尺寸
  • plt.pause(0.1):给Qt后端预留一点渲染时间,确保窗口尺寸已经完成更新(如果你的环境响应慢,可以适当增加这个时间)
  • 设置figsize:将窗口的像素宽高除以当前DPI,转换成matplotlib使用的英寸单位,让figure尺寸和显示窗口完全匹配
  • 保存时使用当前figure的DPI:这样生成的图像在尺寸、字体、线宽上都会和你看到的最大化窗口完全一致

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

火山引擎 最新活动