将Matplotlib图形另存为全屏图像

29

我正在使用Pandas和MatPlotLib构建一个小型的图形化工具,用于解析来自工作机器的数据并输出图表。

当我输出图表时,使用

plt.show()

最终我得到了一张模糊的图片,其中图例和标签挤在一起。

Sample Bad Image 然而,将窗口展开至全屏可以解决我的问题,以一种方式重新定位所有元素,使得图表可见。

然后我将图表保存为 .png 格式,如下所示

plt.savefig('sampleFileName.png')

但是当保存为图像时,保存的不是全屏幕正确版本的绘图,而是错误的默认版本。

我该如何将全屏幕 plt.show() 的绘图保存为 .png 文件?

希望我没有讲得太乱。

谢谢您的帮助!


1
请问您能分享一个 MCVE 吗?或者如果可能的话,提供所有的代码。 - Sait
在这种情况下,我认为这样做并不会有太大的帮助。对不起,我的表达有些混乱。我想使用savefig保存我发布图片的图形,就像plt.show()全屏显示时那样。一个可能的解决方案是更改plt.show()的窗口大小。我该怎么做? - user4933255
可能是如何使用Python最大化plt.show()窗口的重复问题。 - jdhao
5个回答

52

最大化窗口大小的方法取决于您使用的matplotlib后端。请参阅以下示例,了解三个最常见的后端:

import matplotlib.pyplot as plt

plt.figure()
plt.plot([1,2], [1,2])

# Option 1
# QT backend
manager = plt.get_current_fig_manager()
manager.window.showMaximized()

# Option 2
# TkAgg backend
manager = plt.get_current_fig_manager()
manager.resize(*manager.window.maxsize())

# Option 3
# WX backend
manager = plt.get_current_fig_manager()
manager.frame.Maximize(True)

plt.show()
plt.savefig('sampleFileName.png')

您可以使用命令matplotlib.get_backend()来确定正在使用哪个后端。当您保存最大化的版本时,它将保存所需的更大图像。


有没有办法将绘图最大化到比全屏更大的尺寸? - user4933255
1
不太确定为什么您想要将绘图区域放大到全屏以上。您可以设置x-lim和y-lim来缩放绘图的特定部分。调整您的代码以使用plt.show() plt.tight_layout() plt.savefig('sampleFileName.png'),使绘图占用最大化窗口的更多空间。 - gtlambert
10
我正在使用TkAgg后端,这个解决方案可以在最大化视图中显示绘图,但保存的大小是默认大小。你能帮忙吗? - Elgin Cahangirov
2
你也可以尝试使用plt.savefig('figname.png', bbox_inches='tight') - kmario23
1
@ElginCahangirov,你找到解决问题的方法了吗? - SacreD
显示剩余6条评论

13

对于那些使用上述解决方案未能在全屏模式下保存情节的人,这是我真正有效的方法:

    figure = plt.gcf()  # get current figure
    figure.set_size_inches(32, 18) # set figure's size manually to your full screen (32x18)
    plt.savefig('filename.png', bbox_inches='tight') # bbox_inches removes extra white spaces

您可能还想尝试调整 dpi(每英寸点数的分辨率)。

    plt.savefig('filename.png', bbox_inches='tight', dpi=100)

如果你使用的是MacOS 10.15.7和Python 3.7,那么以上提供的解决方案中只有这个可行 :) - letter Q

10

作为另一个选择,我认为值得考虑。

plt.savefig('filename.png', bbox_inches='tight')

如果您正在进行具有看起来凌乱的轴标签的subplots,则此功能特别有用。


1
这正是我想要的。非常感谢! - Yılmaz Alpaslan

4
对于那些在上面的答案中收到错误提示的人,这对我有效。
#Show full screen
mng = plt.get_current_fig_manager()
mng.full_screen_toggle()

完整示例

fig = plt.figure()
fig.imshow(image)
...
plt.figure(fig.number)
mng = plt.get_current_fig_manager()
mng.full_screen_toggle()
fig.show()
fig.savefig('figure.png')
mng.full_screen_toggle()

1
我在这个网站上找到了最常见的答案(链接),它是所有答案的混合物。看起来它可以在所有情况下使用,没有兼容性问题。 如果您对此答案有任何疑问,请随时发表评论。
# Maximise the plotting window
plot_backend = matplotlib.get_backend()
mng = plt.get_current_fig_manager()
if plot_backend == 'TkAgg':
    mng.resize(*mng.window.maxsize())
elif plot_backend == 'wxAgg':
    mng.frame.Maximize(True)
elif plot_backend == 'Qt4Agg':
    mng.window.showMaximized()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接