2012-09-19 54 views
2

我是一个完全的matplotlib noob,目前对示例程序做了小的改动,看看会发生什么,并试图理解大量但没有很好排序的文档。使用matplotlib时的图形控制

我想添加一个图形显示到现有的基于GUI的python程序。我很高兴图形浮动在一个新窗口中,我不需要将它嵌入到tk中(但也许在下周)。

现有的程序有一个用户按下的tk.Button,它调用一个函数来检索某些数据并更新某些标签中的最大/最小/平均值。

我想增强功能,以及更新标签,它也弹出一个数据图。如果图表已经存在,则下一个按钮按下应该用新的按钮替换旧的跟踪并重新自动缩放轴。如果用户关闭图形窗口,下一个按钮按下应弹出一个新的按钮。

每次按下新图都很容易,加入如果不是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

编辑与新的解决方案:另一种解决方案是使用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可能会导致奇怪的结果,因为“当前”数字可能是某些其他函数创建的其他数字。对于你现在正在做的事情来说,这似乎是一个可行的解决方案。

+0

感谢您的建议,但我认为这个限制会给修复带来几天的生命。一旦用户喜欢有一个参数的图表,我知道接下来的几个请求将来自哪里。 –

+0

@Neil_UK:我编辑添加了另一个解决方案。我可能应该首先给出这个答案,但它并没有发生在我身上。这给出了一个更明确的方式来判断你的旧数字是否仍然有效或已关闭。 – BrenBarn

+0

您可能还想保留对'ax.plot()'返回的'line'对象的引用。然后,您可以使用'set_xdata'和'set_ydata'来更新图形,而不必拆卸和重建所有的图形和轴对象。 – tacaswell

相关问题