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

时间:2015-07-30 17:05:48

标签: 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()

我怎么能显示这个数字?

1 个答案:

答案 0 :(得分:12)

plt.close实例上调用figure时,实际销毁的是图形界面( FigureManager ),用于在屏幕上显示图形(请参阅JoeKington在Matplotlib: re-open a closed figure?处的评论。因此,图形实例仍然存在并且尚未被销毁。为了再次显示屏幕上的数字,我们必须以某种方式重建一个接口,以替换在调用plt.close(fig)时已被破坏的接口。

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

虚拟人物方法:

此解决方案基于how to close a show() window but keep the figure alive?Obtaining the figure manager via the OO interface in Matplotlib。用于构建图形界面以在屏幕上显示图形的GUI工具包取决于matplotlib使用的backend。如果使用的后端是 TkAgg TkInter 将在Python 2.7中给出一些可以忽略的警告(请参阅此post on 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()

Pyside方法:

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

重要提示:如果从Spyder运行,则必须在新的专用Python控制台中执行以下代码(按F6),因为Spyder也是启动它自己的QApplication的Qt应用程序(见PySide Qt script doesn't launch from Spyder but works from shell)。

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_())

导致:

enter image description here