2012-06-29 75 views
4

我想知道是否有人有一个想法,为什么下面的代码不按照图形用户界面按钮后显示一个线条在它的图形。我想创建一个程序,在点击一个按钮导入一组数据后,执行一长串命令。其中一个命令是在同一窗口内的图表上显示光谱数据。以下是我迄今为止:如何刷新Tkinter窗口中的matplotlib图?

# import modules that I'm using 
import matplotlib 
matplotlib.use('TKAgg') 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 
import matplotlib.pyplot as pltlib 
import Tkinter 
from Tkinter import * 
import numpy as np 
import scipy as sc 
#import matplotlib.pyplot as pltlib 
# lmfit is imported becuase parameters are allowed to depend on each other along with bounds, etc. 
from lmfit import minimize, Parameters, Minimizer 



#Make object for application 
class App_Window(Tkinter.Tk): 
    def __init__(self,parent): 
     Tkinter.Tk.__init__(self,parent) 
     self.parent = parent 
     self.initialize() 
    def initialize(self): 
     button = Tkinter.Button(self,text="Open File",command=self.OnButtonClick).pack(side=Tkinter.TOP) 
     self.canvasFig=pltlib.figure(1) 
     Fig = matplotlib.figure.Figure(figsize=(5,4),dpi=100) 
     FigSubPlot = Fig.add_subplot(111) 
     x=[] 
     y=[] 
     self.line1, = FigSubPlot.plot(x,y,'r-') 
     self.canvas = matplotlib.backends.backend_tkagg.FigureCanvasTkAgg(Fig, master=self) 
     self.canvas.show() 
     self.canvas.get_tk_widget().pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=1) 
     self.canvas._tkcanvas.pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=1) 
     self.resizable(True,False) 
     self.update() 
    def refreshFigure(self,x,y): 
     self.line1.set_xdata(x) 
     self.line1.set_ydata(y) 
     self.canvas.draw() 
    def OnButtonClick(self): 
     # file is opened here and some data is taken 
     # I've just set some arrays here so it will compile alone 
     x=[] 
     y=[] 
     for num in range(0,1000):x.append(num*.001+1) 
     # just some random function is given here, the real data is a UV-Vis spectrum 
     for num2 in range(0,1000):y.append(sc.math.sin(num2*.06)+sc.math.e**(num2*.001)) 
     X = np.array(x) 
     Y = np.array(y) 
     self.refreshFigure(X,Y) 

if __name__ == "__main__": 
    MainWindow = App_Window(None) 
    MainWindow.mainloop() 

回答

9

这是因为x轴& y轴的范围不会更改为新的数据的范围,改变你的refreshFigure如下:

def refreshFigure(self,x,y): 
    self.line1.set_data(x,y) 
    ax = self.canvas.figure.axes[0] 
    ax.set_xlim(x.min(), x.max()) 
    ax.set_ylim(y.min(), y.max())   
    self.canvas.draw()