关于如何在保存之前最大化窗口的问题已被多次询问并且有几个问题(但仍然没有人可移植),How to maximize a plt.show() window using Python 和How do you change the size of figures drawn with matplotlib?
我创建了一个小函数来在保存图之前最大化图形窗口。它适用于QT5Agg后端。
import matplotlib.pyplot as plt
def maximize_figure_window(figures=None, tight=True):
"""
Maximize all the open figure windows or the ones indicated in figures
Parameters
----------
figures: (list) figure numbers
tight : (bool) if True, applies the tight_layout option
:return:
"""
if figures is None:
figures = plt.get_fignums()
for fig in figures:
plt.figure(fig)
manager = plt.get_current_fig_manager()
manager.window.showMaximized()
if tight is True:
plt.tight_layout()
问题:
(小问题:)
2.为了使tight_layout选项正常工作,我必须使用上述函数两次,即第一次tight = True没有效果。
问题:
- 编辑 -
对于问题3. @DavidG建议听起来不错。我使用tkinter自动获取宽度和高度,将它们转换为英寸,并在fig.set_size_inches中使用它们,或者在图形创建过程中通过fig = plt.figure(figsize =(width,height))直接使用它们。
例如,更便携的解决方案就是如此。 将tkinter导入为tk 将matplotlib.pyplot导入为plt
def maximize_figure(figure=None):
root = tk.Tk()
width = root.winfo_screenmmwidth() / 25.4
height = root.winfo_screenmmheight() / 25.4
if figure is not None:
plt.figure(figure).set_size_inches(width, height)
return width, height
我允许图形为None,这样我就可以使用该函数来检索宽度和高度,并在以后使用它们。
问题1仍然存在。
我在我创建的绘图函数中使用maximize_figure()(让我们说my_plot_func())但是保存的图形在保存到文件时仍然没有正确的尺寸。
我也在创建图形后立即在my_plot_func()中尝试使用time.sleep(5)。不工作。
仅当在控制台中手动运行maximize_figure()并且然后运行my_plot_func(figure = maximized_figure)并且数字已经最大化时,它才有效。这意味着尺寸计算和保存参数是正确的。 如果我在控制台中运行maximize_figure()和my_plot_func(figure = maximized_figure),即一次调用控制台,它就不起作用!我真的不明白为什么。
我还尝试使用像'Agg'这样的非交互式后端,这样就无法在屏幕上实际创建图形。如果我完全调用这些函数或者一个接一个地调用这些函数,那么就不能工作(错误的维度)。
总结和澄清(问题1):
通过在控制台中运行这两段代码,可以正确保存图形。
plt.close('all')
plt.switch_backend('Qt5Agg')
fig = plt.figure()
w, h = maximize_figure(fig.number)
其次是:
my_plot_func(out_file='filename.eps', figure=fig.number)
通过一起运行它们(就像在脚本中一样)图没有正确保存。
plt.close('all')
plt.switch_backend('Qt5Agg')
fig = plt.figure()
w, h = maximize_figure(fig.number)
my_plot_func(out_file='filename.eps', figure=fig.number)
使用
plt.switch_backend('Agg')
而不是
plt.switch_backend('Qt5Agg')
它在两种情况下都不起作用。