From: Lewis, A. J. <AMB...@sa...> - 2009-01-07 13:58:04
|
Hi All: I'm very new to matplotlib, but it seems like a very powerful tool! I'm trying to write a wxpython GUI that displays an image from a data file that the user selected. I've looked at a bunch of examples, but can't seem to get it quite right. I've initialized the image to a buffer of zeros, but can never get it to display the new data! Any/all help & suggestions are greatly appreciated!!! I wrote a "setupPlot" method that is called in the init method of a wx.ScrolledWindow: def SetupPlot(self): self.figure = Figure() self.axes = self.figure.add_subplot(111) self.data = np.zeros((64,8800),float) self.myImage = self.axes.imshow(self.data,aspect=100,animated=True) self.canvas = FigureCanvas(self, -1, self.figure) self.sizer.Add(self.canvas,pos=(1,1)) self.add_toolbar() Here is my "onPaint" event: def OnPaint(self, event): self.canvas.draw() Finally, here is my "openFile" event: def OnOpenFileEvent(self,event): dlg = wx.FileDialog(self,"Open Channel data file...",os.getcwd(), style=wx.OPEN,wildcard=self.wildcard) if dlg.ShowModal() == wx.ID_OK: self.filename = dlg.GetPath() datatype = np.complex64 shape = (64,8800) fd = open(self.filename, 'rb') read_data = np.fromfile(file=fd, dtype=datatype).reshape(shape) x = abs(fftshift(read_data)) self.myImage.set_array(x) self.axes.draw_artist(self.myImage) self.canvas.blit() THANXS amb |
From: John H. <jd...@gm...> - 2009-01-07 14:26:57
|
On Wed, Jan 7, 2009 at 7:57 AM, Lewis, Ambrose J. <AMB...@sa...> wrote: > Hi All: > > I'm very new to matplotlib, but it seems like a very powerful tool! > > I'm trying to write a wxpython GUI that displays an image from a data file > that the user selected. I've looked at a bunch of examples, but can't seem > to get it quite right. I've initialized the image to a buffer of zeros, but > can never get it to display the new data! > > Any/all help & suggestions are greatly appreciated!!! You might try simplifying the problem to see if it is matplotlib, your image data, your use of animation or wx. Ie, with *your* image data, can you get the image to update in the pylab shell In [1]: ax = subplot(111) In [2]: data = np.random.rand(10,5) In [3]: im = ax.imshow(data) In [4]: ax.figure.canvas.draw() In [5]: data2 = np.random.rand(10,5) In [6]: im.set_array(data2) In [7]: ax.figure.canvas.draw() If not, perhaps there is some massaging of the raw data that is needed. If that works, try taking the animation calls out of the loop (don't set the animated property, don't use draw_artist, don't use blit) but just set the image data and call canvas.draw() I did a quick read through of the code and did not find anything glaringly wrong, so you need to start simplifying the problem and reducing it to hone in on where the problem is occurring. If you post a free standing script that we can run , with the data, in all likelihood we can find the problem. You might even find it yourself in the process of developing a minimal script <wink> JDH |
From: Lewis, A. J. <AMB...@sa...> - 2009-01-08 17:34:49
|
Thanks for the quick reply John...I got it working. To test the data file, I wrote a small script to display it outside of a wxPython GUI. I slightly modified the "image_demo.py" example to read from my data file and convert the data. This example reads in a file of complex values and displays them as an image: import numpy as np import matplotlib.cm as cm import matplotlib.mlab as mlab import matplotlib.pyplot as plt from scipy.fftpack import fftshift datatype = np.complex64 shape = (64,8800) fd = open('C:\\asp\\aspGui\\testData\\chan_output.bin', 'rb') read_data = np.fromfile(file=fd, dtype=datatype).reshape(shape) x = abs(fftshift(read_data)) im = plt.imshow(x,aspect='auto') plt.show() Next, as suggested, I wrote a small wxPython GUI that updates an image based on user selections. In this example, the image is updated when the user clicks on a button. The image will alternate between random values and zeros: import numpy as np import matplotlib.cm as cm import matplotlib.mlab as mlab import matplotlib.pyplot as plt from scipy.fftpack import fftshift from wx import * from matplotlib.figure import Figure from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas from numpy.random import randn class PlotFigure(Frame): def __init__(self): Frame.__init__(self, None, -1, "Test embedded wxFigure") # make some random data... x = np.clip(randn(64,8800), -1, 1) # make the image... self.figure = Figure() self.axes = self.figure.add_subplot(111) self.canvas = FigureCanvas(self, -1, self.figure) self.myImage = self.axes.imshow(x,aspect='auto') # add button to change the image... self.myButton = Button(self,-1,'change data') self.myButton.Bind(wx.EVT_BUTTON, self.OnButtonClick) # add the image to the display... sizer = BoxSizer(VERTICAL) sizer.Add(self.canvas, 1, LEFT|TOP|GROW) sizer.Add(self.myButton) self.SetSizer(sizer) self.Fit() self.myFlag = 0 def OnButtonClick(self,event): if self.myFlag == 1: x = np.clip(randn(64,8800), -1, 1) self.myFlag = 0 else: x = np.zeros((64,8800),float) self.myFlag = 1 self.myImage.set_array(x) self.canvas.draw() if __name__ == '__main__': app = PySimpleApp() frame = PlotFigure() frame.Show() app.MainLoop() -----Original Message----- From: John Hunter [mailto:jd...@gm...] Sent: Wednesday, January 07, 2009 9:23 AM To: Lewis, Ambrose J. Cc: mat...@li... Subject: Re: [Matplotlib-users] updating image in wxpython gui... On Wed, Jan 7, 2009 at 7:57 AM, Lewis, Ambrose J. <AMB...@sa...> wrote: > Hi All: > > I'm very new to matplotlib, but it seems like a very powerful tool! > > I'm trying to write a wxpython GUI that displays an image from a data file > that the user selected. I've looked at a bunch of examples, but can't seem > to get it quite right. I've initialized the image to a buffer of zeros, but > can never get it to display the new data! > > Any/all help & suggestions are greatly appreciated!!! You might try simplifying the problem to see if it is matplotlib, your image data, your use of animation or wx. Ie, with *your* image data, can you get the image to update in the pylab shell In [1]: ax = subplot(111) In [2]: data = np.random.rand(10,5) In [3]: im = ax.imshow(data) In [4]: ax.figure.canvas.draw() In [5]: data2 = np.random.rand(10,5) In [6]: im.set_array(data2) In [7]: ax.figure.canvas.draw() If not, perhaps there is some massaging of the raw data that is needed. If that works, try taking the animation calls out of the loop (don't set the animated property, don't use draw_artist, don't use blit) but just set the image data and call canvas.draw() I did a quick read through of the code and did not find anything glaringly wrong, so you need to start simplifying the problem and reducing it to hone in on where the problem is occurring. If you post a free standing script that we can run , with the data, in all likelihood we can find the problem. You might even find it yourself in the process of developing a minimal script <wink> JDH |