保存之前最大化数字

时间:2018-04-17 12:58:07

标签: python-3.x matplotlib

关于如何在保存之前最大化窗口的问题已被多次询问并且有几个问题(但仍然没有人可移植),How to maximize a plt.show() window using PythonHow 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()

问题:

  1. 在使用plt.savefig()命令之前,我必须等待窗口实际最大化,否则它将保存为未最大化。如果我只想在脚本
  2. 中使用上述功能,这是一个问题

    (小问题:)
     2.为了使tight_layout选项正常工作,我必须使用上述函数两次,即第一次tight = True没有效果。

    1. 该解决方案不可移植。当然,我可以添加我可能使用的所有可能的后端,但这有点难看。
    2. 问题:

      1. 如何让脚本等待窗口最大化?我不想使用time.sleep(tot_seconds),因为tot_seconds会有点任意,使得函数的可移植性更低
      2. 如何解决问题2?我想这与问题1有关。
      3. 是否有“最大化所有打开窗口”问题的便携式解决方案?
      4. - 编辑 -

        对于问题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')
        

        它在两种情况下都不起作用。

0 个答案:

没有答案