【问题标题】:How to maximize a plt.show() window using Python如何使用 Python 最大化 plt.show() 窗口
【发布时间】:2022-03-02 07:28:42
【问题描述】:

出于好奇,我想知道如何在下面的代码中执行此操作。我一直在寻找答案,但没用。

import numpy as np
import matplotlib.pyplot as plt
data=np.random.exponential(scale=180, size=10000)
print ('el valor medio de la distribucion exponencial es: ')
print np.average(data)
plt.hist(data,bins=len(data)**0.5,normed=True, cumulative=True, facecolor='red', label='datos tamano paqutes acumulativa', alpha=0.5)
plt.legend()
plt.xlabel('algo')
plt.ylabel('algo')
plt.grid()
plt.show()

【问题讨论】:

  • 剧透,在 Windows 上工作:plt.get_current_fig_manager().window.state('zoomed') 然后plt.show()
  • 对我不起作用

标签: python matplotlib


【解决方案1】:

我在 Windows (WIN7) 上,运行 Python 2.7.5 和 Matplotlib 1.3.1。

我能够使用以下行最大化 TkAgg、QT4Agg 和 wxAgg 的图形窗口:

from matplotlib import pyplot as plt

### for 'TkAgg' backend
plt.figure(1)
plt.switch_backend('TkAgg') #TkAgg (instead Qt4Agg)
print '#1 Backend:',plt.get_backend()
plt.plot([1,2,6,4])
mng = plt.get_current_fig_manager()
### works on Ubuntu??? >> did NOT working on windows
# mng.resize(*mng.window.maxsize())
mng.window.state('zoomed') #works fine on Windows!
plt.show() #close the figure to run the next section

### for 'wxAgg' backend
plt.figure(2)
plt.switch_backend('wxAgg')
print '#2 Backend:',plt.get_backend()
plt.plot([1,2,6,4])
mng = plt.get_current_fig_manager()
mng.frame.Maximize(True)
plt.show() #close the figure to run the next section

### for 'Qt4Agg' backend
plt.figure(3)
plt.switch_backend('QT4Agg') #default on my system
print '#3 Backend:',plt.get_backend()
plt.plot([1,2,6,4])
figManager = plt.get_current_fig_manager()
figManager.window.showMaximized()
plt.show()

如果你想最大化多个数字,你可以使用

for fig in figs:
    mng = fig.canvas.manager
    # ...

希望在一个工作示例(至少对于 Windows)中结合以前的答案(和一些补充)的摘要有所帮助。 干杯

【讨论】:

  • ### 在 Ubuntu 上工作??? >> 没有在 Windows 上工作 mng.resize(*mng.window.maxsize()) #在 linux 上对我来说完美
  • @Daniele,您的解决方案适用于 Ubuntu 上的 TkAgg。谢谢!但是我花了一些时间来解析;)也许在“mng.resize ...”之前摆脱一切。
  • 有没有一种简单的方法可以检查您正在使用的后端?现在有点使用试用结束错误。
  • 不幸的是,我用 Qt5Agg 尝试了你的代码,当我输入 figManager.window.showMaximized() 时,刚刚弹出最大化的全屏窗口。下一行:plt.show() 只是显示另一个窗口,在正常大小的窗口中绘制数据。
  • 基于 Tk 的解决方案对我不起作用:_tkinter.TclError: bad argument "zoomed": must be normal, iconic, or withdrawn (Ubuntu 16.04)。
【解决方案2】:

使用 Qt 后端 (FigureManagerQT) 正确的命令是:

figManager = plt.get_current_fig_manager()
figManager.window.showMaximized()

【讨论】:

  • 这之后仍然需要plt.show()。很好的答案,但适用于 Windows!
  • '_tkinter.tkapp' 对象具有双向属性 'showMaximized'。始终坚信 Python 是一个笑话而不是一门语言
  • @HAL9000 首先,这是针对 Qt4,而不是 Tk。其次,您将外部包设计问题归咎于语言。您可以用任何语言遇到此类问题。
  • 我在 Windows 上收到 AttributeError: '_tkinter.tkapp' object has no attribute 'showMaximized'
  • 适用于我的 PyQt5 后端。
【解决方案3】:

在 Ubuntu 12.04 和 TkAgg 后端下,这让我的窗口占据了全屏:

    mng = plt.get_current_fig_manager()
    mng.resize(*mng.window.maxsize())

【讨论】:

  • 请注意,这会对多显示器设置产生奇怪的影响。该窗口将用完所有显示器,而不是最大化。
  • 这不会创建一个最大化的窗口(它应该捕捉到屏幕的边缘),但会创建一个具有最大化窗口大小的非最大化窗口。
  • 这在 Ubuntu 14.04 中也成功地最大化了窗口,保持顶部栏与我们都知道的按钮。
  • 适用于 Ubuntu 16.04 和 linux mint。 python2.7测试过
  • @user1202136 在 3 显示器设置中工作正常。
【解决方案4】:

对我来说,上述方法均无效。我在包含 matplotlib 1.3.1 的 Ubuntu 14.04 上使用 Tk 后端。

以下代码创建了一个全屏绘图窗口,它与最大化不同,但它很好地满足了我的目的:

from matplotlib import pyplot as plt
mng = plt.get_current_fig_manager()
mng.full_screen_toggle()
plt.show()

【讨论】:

  • 这也是对我有用的解决方案(尽管它进入全屏,而不是最大化窗口)。在 Redhat Enterprise Linux 6、python 2.7.10、matplotlib 1.4.3 上运行。
  • 在 Windows 10 x64、python 3.5 上的 Visual Studio 2015 中为我工作,但我无法访问窗口边框以关闭图形,因为它位于顶部屏幕像素上方。
  • 对我来说,这也不会创建一个最大化的窗口,而是一个全屏窗口。我没有像普通窗口那样得到任何最小化、最大化/恢复向下和关闭按钮,我必须右键单击任务栏上的窗口才能关闭它。
  • 这会全屏显示,而不显示每个窗口都有的按钮。在 Ubuntu 14.04 上试过。
  • 在 Raspbian (jessie) 上像魅力一样工作
【解决方案5】:

这应该可以(至少使用 TkAgg):

wm = plt.get_current_fig_manager()
wm.window.state('zoomed')

(取自上述和Using Tkinter, is there a way to get the usable screen size without visibly zooming a window?

【讨论】:

  • 耶!这对我有用;它会创建一个最大化的窗口,该窗口会捕捉到屏幕的边缘,并具有应有的最小化、最大化/恢复向下和关闭按钮。
  • 但是,你的意思是这适用于TkAgg,而不是TkApp,对吧?
  • 很好(可能是错字)! TkAgg 是 Tk 的后端。
  • 刚刚测试了这个 matplotlib 2 / python 3 。在 windows 下工作!
  • 唉,在没有“缩放”状态的 Debian linux 上不起作用。
【解决方案6】:

我经常用

mng = plt.get_current_fig_manager()
mng.frame.Maximize(True)

在调用plt.show() 之前,我得到了一个最大化的窗口。这仅适用于“wx”后端。

编辑:

对于 Qt4Agg 后端,请参阅 kwerenda 的answer

【讨论】:

  • 使用这个,我在 Matplotlib 1.2.0 中得到 mng.frame.Maximize(True) AttributeError: FigureManagerTkAgg instance has no attribute 'frame'
  • 它适用于后端 wx,我已经相应地更新了帖子。您使用的 Tk 后端可能不支持此功能。您可以选择将 matplotlib 后端更改为“wx”吗?
  • mac 上的错误:mng.frame.Maximize(True) AttributeError: 'FigureManagerMac' object has no attribute 'frame'
  • MacOSXbackend 上是否有已知的解决方案? FigureManagerMac 似乎既没有属性window也没有frame
  • 我在 Windows 上遇到了同样的问题
【解决方案7】:

到目前为止我的最大努力,支持不同的后端:

from platform import system
def plt_maximize():
    # See discussion: https://stackoverflow.com/questions/12439588/how-to-maximize-a-plt-show-window-using-python
    backend = plt.get_backend()
    cfm = plt.get_current_fig_manager()
    if backend == "wxAgg":
        cfm.frame.Maximize(True)
    elif backend == "TkAgg":
        if system() == "Windows":
            cfm.window.state("zoomed")  # This is windows only
        else:
            cfm.resize(*cfm.window.maxsize())
    elif backend == "QT4Agg":
        cfm.window.showMaximized()
    elif callable(getattr(cfm, "full_screen_toggle", None)):
        if not getattr(cfm, "flag_is_max", None):
            cfm.full_screen_toggle()
            cfm.flag_is_max = True
    else:
        raise RuntimeError("plt_maximize() is not implemented for current backend:", backend)

【讨论】:

    【解决方案8】:

    我也收到mng.frame.Maximize(True) AttributeError: FigureManagerTkAgg instance has no attribute 'frame'

    然后我查看了mng的属性,我发现了这个:

    mng.window.showMaximized()
    

    这对我有用。

    所以有同样困扰的朋友可以试试这个。

    顺便说一下,我的 Matplotlib 版本是 1.3.1。

    【讨论】:

    • 谢谢!这个解决方案对我很有效。在 Redhat Enterprise Linux 6、python 2.7.10、matplotlib 1.4.3 上运行。
    • 我知道这会弹出一个全屏窗口,但是当我输入plt.show() 时,我的绘图会出现在一个单独的窗口中。不在这个全屏窗口上,有什么建议吗?
    • 它也适用于 Debian 上的 python 3.6 和 Qt 后端。
    • 这不能在带有 python 3.7 的 windows 10 64bit 上运行
    【解决方案9】:

    这是一种 hacky 并且可能不便携,仅当您正在寻找快速和肮脏时才使用它。如果我只是将图形设置为比屏幕大得多,它会占用整个屏幕。

    fig = figure(figsize=(80, 60))
    

    事实上,在带有 Qt4Agg 的 Ubuntu 16.04 中,如果窗口大于屏幕,它会最大化窗口(不是全屏)。 (如果您有两台显示器,它只会在其中一台上最大化它)。

    【讨论】:

    • 为我工作!因为我正在尝试获取屏幕的大小。
    • 如果你使用双显示器,这会分散在两个屏幕上,这是不切实际的。
    【解决方案10】:

    我在 Ubuntu 上找到了全屏模式

    #Show full screen
    mng = plt.get_current_fig_manager()
    mng.full_screen_toggle()
    

    【讨论】:

      【解决方案11】:

      在 Win 10 上完美运行的一种解决方案。

      import matplotlib.pyplot as plt
      
      plt.plot(x_data, y_data)
      
      mng = plt.get_current_fig_manager()
      mng.window.state("zoomed")
      plt.show()
      

      【讨论】:

        【解决方案12】:
        import matplotlib.pyplot as plt
        def maximize():
            plot_backend = plt.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()
        

        然后在plt.show()之前调用函数maximize()

        【讨论】:

        • 不适用于 2 台显示器。它只是将窗口位置更改为屏幕大小(而不是显示器大小),并且不会将其放在屏幕的左上角像素上。 @ch271828n 解决方案运行良好
        【解决方案13】:

        当专注于绘图时按下f 键(或1.2rc1 中的ctrl+f)将全屏显示绘图窗口。不是最大化,但也许更好。

        除此之外,要真正最大化,您将需要使用 GUI Toolkit 特定命令(如果它们存在于您的特定后端)。

        HTH

        【讨论】:

        • 这解释了我一直不小心按的哪个键会全屏显示我的窗口! (以及如何撤消它。)
        【解决方案14】:

        这是一个基于@Pythonio 回答的函数。我将其封装成一个函数,该函数会自动检测它正在使用哪个后端并执行相应的操作。

        def plt_set_fullscreen():
            backend = str(plt.get_backend())
            mgr = plt.get_current_fig_manager()
            if backend == 'TkAgg':
                if os.name == 'nt':
                    mgr.window.state('zoomed')
                else:
                    mgr.resize(*mgr.window.maxsize())
            elif backend == 'wxAgg':
                mgr.frame.Maximize(True)
            elif backend == 'Qt4Agg':
                mgr.window.showMaximized()
        

        【讨论】:

          【解决方案15】:

          对于后端GTK3Agg,使用maximize()——尤其是小写m

          manager = plt.get_current_fig_manager()
          manager.window.maximize()
          

          在 Ubuntu 20.04 中使用 Python 3.8 测试。

          【讨论】:

            【解决方案16】:

            在我的版本(Python 3.6、Eclipse、Windows 7)中,上面给出的 sn-ps 不起作用,但在 Eclipse/pydev 给出的提示下(输入:mng.),我发现:

            mng.full_screen_toggle()
            

            看来使用 mng-commands 只用于本地开发是可以的...

            【讨论】:

              【解决方案17】:

              尝试使用“Figure.set_size_inches”方法,带有额外的关键字参数forward=True。根据documentation,这应该调整图形窗口的大小。

              是否实际发生取决于您使用的操作系统。

              【讨论】:

                【解决方案18】:

                尝试plt.figure(figsize=(6*3.13,4*3.13)) 使情节更大。

                【讨论】:

                  【解决方案19】:

                  好的,这对我有用。我做了整个 showMaximize() 选项,它确实根据图形大小调整窗口大小,但它不会扩展和“适合”画布。我通过以下方式解决了这个问题:

                  mng = plt.get_current_fig_manager()                                         
                  mng.window.showMaximized()
                  plt.tight_layout()    
                  plt.savefig('Images/SAVES_PIC_AS_PDF.pdf') 
                  
                  plt.show()
                  

                  【讨论】:

                    【解决方案20】:

                    对于基于 Tk 的后端 (TkAgg),这两个选项最大化和全屏显示窗口:

                    plt.get_current_fig_manager().window.state('zoomed')
                    plt.get_current_fig_manager().window.attributes('-fullscreen', True)
                    

                    当绘制到多个窗口时,你需要为每个窗口写这个:

                    data = rasterio.open(filepath)
                    
                    blue, green, red, nir = data.read()
                    plt.figure(1)
                    plt.subplot(121); plt.imshow(blue);
                    plt.subplot(122); plt.imshow(red);
                    plt.get_current_fig_manager().window.state('zoomed')
                    
                    rgb = np.dstack((red, green, blue))
                    nrg = np.dstack((nir, red, green))
                    plt.figure(2)
                    plt.subplot(121); plt.imshow(rgb);
                    plt.subplot(122); plt.imshow(nrg);
                    plt.get_current_fig_manager().window.state('zoomed')
                    
                    plt.show()
                    

                    在这里,两个“数字”都绘制在不同的窗口中。使用变量如

                    figure_manager = plt.get_current_fig_manager()
                    

                    可能不会最大化第二个窗口,因为变量仍然引用第一个窗口。

                    【讨论】:

                      【解决方案21】:

                      这不一定会最大化您的窗口,但它会根据图形大小调整窗口大小:

                      from matplotlib import pyplot as plt
                      F = gcf()
                      Size = F.get_size_inches()
                      F.set_size_inches(Size[0]*2, Size[1]*2, forward=True)#Set forward to True to resize window along with plot in figure.
                      plt.show() #or plt.imshow(z_array) if using an animation, where z_array is a matrix or numpy array
                      

                      这也可能有帮助:http://matplotlib.1069221.n5.nabble.com/Resizing-figure-windows-td11424.html

                      【讨论】:

                        【解决方案22】:

                        以下可能适用于所有后端,但我只在 QT 上测试过:

                        import numpy as np
                        import matplotlib.pyplot as plt
                        import time
                        
                        plt.switch_backend('QT4Agg') #default on my system
                        print('Backend: {}'.format(plt.get_backend()))
                        
                        fig = plt.figure()
                        ax = fig.add_axes([0,0, 1,1])
                        ax.axis([0,10, 0,10])
                        ax.plot(5, 5, 'ro')
                        
                        mng = plt._pylab_helpers.Gcf.figs.get(fig.number, None)
                        
                        mng.window.showMaximized() #maximize the figure
                        time.sleep(3)
                        mng.window.showMinimized() #minimize the figure
                        time.sleep(3)
                        mng.window.showNormal() #normal figure
                        time.sleep(3)
                        mng.window.hide() #hide the figure
                        time.sleep(3)
                        fig.show() #show the previously hidden figure
                        
                        ax.plot(6,6, 'bo') #just to check that everything is ok
                        plt.show()
                        

                        【讨论】:

                          【解决方案23】:

                          我在尝试实现相同目标时从正在查看的线程中收集了一些答案。这是我现在正在使用的功能,它最大化所有图并且并不真正关心正在使用的后端。我在脚本末尾运行它。它仍然遇到其他使用多屏设置的人提到的问题,因为 fm.window.maxsize() 将获得总屏幕尺寸,而不仅仅是当前显示器的尺寸。如果你知道你想要的屏幕尺寸,你可以用元组 (width_inches, height_inches) 替换 *fm.window.maxsize()。

                          从功能上讲,这一切都是抓取一个数字列表,并将它们的大小调整为 matplotlibs 当前对当前最大窗口大小的解释。

                          def maximizeAllFigures():
                              '''
                              Maximizes all matplotlib plots.
                              '''
                              for i in plt.get_fignums():
                                  plt.figure(i)
                                  fm = plt.get_current_fig_manager()
                                  fm.resize(*fm.window.maxsize())
                          

                          【讨论】:

                          • 在 Stack Overflow 上,如何 很重要,但网站质量水平的很大一部分来自人们不遗余力地解释 为什么。虽然仅代码的答案可以让提出问题的人克服他们可能面临的任何障碍,但从长远来看,这对他们或未来的访问者没有多大好处。见Is there any benefit in code-only answers?
                          猜你喜欢
                          • 2015-08-05
                          • 1970-01-01
                          • 2021-12-05
                          • 1970-01-01
                          • 2013-04-05
                          • 2012-08-26
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多