我有一个返回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)
这包括使用新画布和工具栏重建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)
这导致:
归档时间: |
|
查看次数: |
3619 次 |
最近记录: |