我有一个函数,它返回用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()
我怎么能显示这个数字?
答案 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()
这包括使用新画布和工具栏重建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_())
导致: