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




