我是一个完整的matplotlib noob,目前正在对示例程序进行细微更改,看看会发生什么,并尝试理解广泛但不完整的文档。
我正在尝试将图形显示添加到现有的基于tk gui的python程序中。我很高兴图形浮动在一个新窗口中,我不需要它嵌入在tk中(但是,下周也许)。
现有程序有一个用户按下的tk.Button,它调用一个函数来检索某些数据并更新某些标签中的最大/最小/平均值。
我希望增强功能以便更新标签,它还会弹出数据图表。如果图形已经存在,则按下下一个按钮应该用新的曲线替换旧曲线并重新自动缩放轴。如果用户关闭图形窗口,则按下一个按钮应弹出一个新按钮。
一个新的图表每次按下都很简单,添加if if self.fig测试让我变成一个。它添加了持久性跟踪,直到我添加了plt.clf()。但是,如果用户关闭图形窗口,则下面的代码不会重新创建它。我想我需要像图表可见,或者如果图表存在,而不是在self.fig上测试。或许我错过了显而易见的方法,并且有更好的方法吗?非常感谢。
import Tkinter as tk
import os, sys
import numpy as np
import numpy.random as npr
import matplotlib.pyplot as plt
class Plotter():
def __init__(self):
self.fig=None
self.ax=None
def do_stuff(self):
# make plausible data
a=np.arange(0,3,0.1)
b=npr.random(1)
c=np.power(a,b)
if not self.fig:
self.fig = plt.figure()
else:
plt.clf()
self.ax = self.fig.add_subplot(111)
self.ax.plot(a,c,'k--')
self.ax.set_yticklabels([])
self.ax.set_xticklabels([])
plt.show()
p=Plotter()
root=tk.Tk()
rt = tk.Button(root, text='Capture', command=p.do_stuff)
rt.grid(row=0, column=0)
qt = tk.Button(root, text='quit', command=sys.exit)
qt.grid(row=1, column=0)
root.mainloop()
答案 0 :(得分:0)
使用新解决方案编辑:另一种解决方案是使用pyplot.fignum_exists
检查您的数字是否仍然存在。所以你可以这样做:
if self.fig is None or not pyplot.fignum_exists(self.fig.number):
self.fig = pyplot.figure()
# self.fig will now be active, either via an old still-open figure or a newly-created one
后代的旧解决方案:
问题是如果关闭图形不会影响你的self.fig
,虽然它会使图形对象无效。一种选择是使用pyplot.gcf()
代替pyplot.figure()
,代表“获取当前数字”。如果一个打开,这将返回一个现有数字,如果没有活动数字,它将返回一个新数字。因此,在您的do_stuff
方法中,您可以使用pyplot.gcf()
,它将返回您的旧图形对象或新图形对象,您无需担心哪个。所以就这样做:
def do_stuff(self):
# make plausible data
fig = pyplot.gcf()
fig.clf()
self.ax = fig.add_subplot(111)
# etc.
这显然有局限性。特别是,如果程序的任何其他部分也创建或使用matplotlib数字,那么使用gcf
可能会导致奇怪的结果,因为“当前”数字可能是某些其他函数创建的其他数字。对于你现在正在做的事情,这似乎是一个可行的解决方案。