Matplotlib:如何显示已关闭的数字

Peq*_*que 6 python matplotlib

我有一个返回Figure创建的函数pyplot.此函数在返回之前关闭图形.如果我没有关闭它,只显示它会很容易plt.show(),但让我们假设我不能这样做.

我可以轻松地将返回Figure的文件保存到文件中,但是我找不到显示它的方法(即:有一个显示该图的弹出窗口).

from matplotlib import pyplot as plt                                                


def new_figure():                                                                   
    fig = plt.figure()                                                              
    plt.plot([0, 1], [2, 3])                                                        
    plt.close(fig)                                                                  
    return fig                                                                      


fig = new_figure()                                                                  
fig.savefig('output.svg')                                                           
fig.show()
Run Code Online (Sandbox Code Playgroud)

我怎么能显示这个数字?

Jea*_*ien 13

plt.close被称为一个figure实例,什么是真正破坏是图形界面(FigureManager用来显示在屏幕上图)(见由JoeKington评论Matplotlib:重新打开封闭图形).因此,图形实例仍然存在并且尚未被销毁.为了再次在屏幕上显示图形,我们必须以某种方式重建一个接口来替换在调用时已经被破坏的接口plt.close(fig).

这可以通过简单地创建一个plt.figure()"窃取"其管理器的新图形来完成,并使用它来显示我们想要在屏幕上显示的图形.或者,可以手动重建界面以使用GUI工具包显示图形.我提供用一个例子PySide使用Qt4Agg后端.此外,还有一个很好的例子,展示了如何使用Tkinter(TkAgg)来完成这项工作:http://matplotlib.org/examples/user_interfaces/embedding_in_tk.html (我也测试了这种方法并且它可以工作).

虚拟人物方法:

此解决方案基于如何关闭show()窗口但保持图形活着?通过Matplotlib中的OO接口获取图形管理器.用于构建图形界面以在屏幕上显示图形的GUI工具包取决于matplotlib使用的后端.如果使用的后端是TkAgg,TkInter将在Python 2.7中给出一些可以忽略的警告(参见python bug tracker上的这篇文章).

import matplotlib.pyplot as plt

def new_figure(): 

    fig = plt.figure()
    plt.plot([0, 1], [2, 3])
    plt.close(fig)
    return fig

def show_figure(fig):

    # create a dummy figure and use its
    # manager to display "fig"

    dummy = plt.figure()
    new_manager = dummy.canvas.manager
    new_manager.canvas.figure = fig
    fig.set_canvas(new_manager.canvas)

if __name__ == '__main__':

    fig = new_figure()
    show_figure(fig)

    plt.show()
Run Code Online (Sandbox Code Playgroud)

Pyside方法:

这包括使用新画布和工具栏重建GUI以fig在屏幕上显示实例.

重要说明:如果从Spyder运行,下面的代码必须在新的专用Python控制台中执行(按F6),因为Spyder也是启动它自己的QApplication的Qt应用程序(参见PySide Qt脚本不是从Spyder启动但是从贝壳).

import matplotlib
matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT
import matplotlib.pyplot as plt

from PySide import QtGui
import sys

def new_figure():

    fig = plt.figure()
    plt.plot([0, 1], [2, 3])
    plt.close(fig)
    return fig   

class myFigCanvas(QtGui.QWidget):

    def __init__(self, fig, parent=None):
        super(myFigCanvas, self).__init__(parent)

        #---- create new canvas and toolbar --

        canvas = FigureCanvasQTAgg(fig)
        toolbar = NavigationToolbar2QT(canvas, self)

        #---- setup layout of GUI ----

        grid = QtGui.QGridLayout()    
        grid.addWidget(canvas, 0, 0)
        grid.addWidget(toolbar, 1, 0)

        self.setLayout(grid)

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)

    fig = new_figure()   
    new_canvas = myFigCanvas(fig) 
    new_canvas.show()    

    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

这导致:

在此输入图像描述

  • mpl真的应该有一个'reshow'方法在数字/ figure_managers (8认同)
  • 以防万一其他人遇到这种情况,请注意,虽然这有效,但它会破坏绘图交互性 - 工具栏(光标位置、缩放等)仍然链接到原始图形,而不是新图形。我想也许将比“new_manager.canvas.figure = Fig”更多的属性从旧管理器复制到新管理器可能会起作用,但我还无法解决这个问题。 (2认同)