Attached is an example. It seems like it autosizes to the initial data and from then on only uses that for autoscale purposes. I only noticed that while making this test app because I let it autoscale the x axis in this one.

R.
#!/usr/bin/env pythonw

#### Standard Python
import sys
import os

#### Installed Modules
if 0:
    import wxversion
    wxversion.select('2.6.3.3')

import wx
import wx.lib.scrolledpanel as scrolled

import matplotlib
from matplotlib.numerix import *

if 1:
    matplotlib.use('WXAgg')
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvasWx
    from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar2Wx
else:
    matplotlib.use('WX')
    from matplotlib.backends.backend_wx import FigureCanvasWx as FigureCanvasWx
    from matplotlib.backends.backend_wx import NavigationToolbar2Wx as NavigationToolbar2Wx


from matplotlib.figure import Figure


class AnalysisPlotFrame(wx.Frame):
    def __init__(self, parent, title=None):
        title = 'Untitled Plot Analysis'

        # Initialize the Frame base class
        wx.Frame.__init__(self,parent,-1,title,size=(550,350),name='plot')

        # bind the close event
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)


        # Create a place to store all x and y data for each axes and an X time variable
        self.Xt=10
        #self.Xt=len(self.ct_file.saw_data[0])

        # This will hold references to each axes created along with all of the data plotted
        self.axes_data = {}

        # a panel for all of the controls
        panel = scrolled.ScrolledPanel(self, -1)

        # Create the main figure
        plot_list = [(self.GetSinFigure,{})]
        cols_plot_list = [(self.GetSinFigure,{})]
        figure = Figure()
        base_plot_number = len(plot_list) * 100 + 10
        #base_plot_number = len(cols_plot_list) * 100 + 20
        for n, plot in enumerate(plot_list):
            figure_function, args = plot
            if not figure_function:
                continue
            print base_plot_number + n + 1
            figure = figure_function(panel, subplot=base_plot_number + n + 1, figure=figure, **args)

        # Create the canvas
        self.canvas = FigureCanvasWx(panel, -1, figure)

        # Catch the event when the xaxis is changed on any of the axes so we can keep them
        # all together
        self.axes_list = figure.get_axes()

        def on_xlim_changed(axis):
            #print 'Axes updated'
            xlim = axis.get_xlim()
            self.set_all_xlim(xlim)

        # TODO: Insert that hack where we override the default axes.set_xlim with our own
        # For now, we have emit defaulting to True in axes.py
        for axis in self.axes_list:
            axis.connect('xlim_changed', on_xlim_changed)

        # Compute an x window range and set that
        xlim = self.ComputeXlim()
        self.set_all_xlim(xlim)


        # Create a sizer for the frame
        self.sizer = wx.BoxSizer(wx.VERTICAL)

        # Add the toolbar now so it will be at the top on Windows (no effect on Mac)
        self.add_toolbar(panel)  # comment this out for no toolbar

        # Add the plots
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)

        # Create an update button which we'll use to step through the updates
        btn = wx.Button(panel, -1, 'Update')
        self.Bind(wx.EVT_BUTTON, self.OnUpdateButton, btn)
        btn.SetDefault()

        self.sizer.Add(btn, 0, wx.ALL, 10)

        panel.SetSizerAndFit(self.sizer)
        panel.SetupScrolling()

        # resize the frame to fit the children
        self.SetClientSize(panel.GetSize())
        

    def set_all_xlim(self, xlim):
        for axis in self.axes_list:
            axis.set_xlim(xlim, emit=False)

    def ComputeXlim(self):
        width = 60
        step = 0.01
        window_size = width * step
        if (self.Xt * step) < window_size:
            xlim = [0, window_size]
        else:
            xlim = [(self.Xt * step) - window_size, (self.Xt * step)]
        print self.Xt, xlim
            
        return xlim
        

    def OnUpdateButton(self, event):
        incr = 170
        
        self.Xt = self.Xt + incr
        xlim = self.ComputeXlim()
        self.set_all_xlim(xlim)

        for axes, plot_data in self.axes_data.items():
            for line, xy in zip(axes.get_lines(), plot_data):
                line.set_data(xy[0][:self.Xt], xy[1][:self.Xt])

            locator = axes.yaxis.get_major_locator()
            print axes.get_ylim()
            ylim = locator.autoscale()
            print ylim
            axes.set_ylim(ylim, emit=False)
            print axes.get_ylim()
            
            #if axes.get_autoscale_on():
                #print 'Setting autoscale'
                #axes.set_autoscale_on(False)
            axes.autoscale_view(scalex=False, scaley=True)
            print axes.get_ylim()
            axes.autoscale_view(scalex=True, scaley=True)
            print axes.get_ylim()

            #axes.draw()

        self.canvas.draw()
        # TODO: Update the fills and horizontal bars
        self.Refresh()


    def add_toolbar(self, parent=None):
        if not parent:
            parent = self
        class NavigationToolbar2WxAgg_CT(NavigationToolbar2Wx):
            def press_pan(self, event):
                # Ignore the event if the 'alt' key is held down
                if event.key != 'alt':
                    NavigationToolbar2Wx.press_pan(self, event)

            def press_zoom(self, event):
                # Ignore the event if the 'alt' key is held down
                if event.key != 'alt':
                    NavigationToolbar2Wx.press_zoom(self, event)

        
        self.toolbar = NavigationToolbar2WxAgg_CT(self.canvas)
        self.toolbar.Realize()
        if parent==self and wx.Platform == '__WXMAC__':
            # Mac platform (OSX 10.3, MacPython) does not seem to cope with
            # having a toolbar in a sizer. This work-around gets the buttons
            # back, but at the expense of having the toolbar at the top
            self.SetToolBar(self.toolbar)
        else:
            # On Windows platform, default window size is incorrect, so set
            # toolbar width to figure width.
            tw, th = self.toolbar.GetSizeTuple()
            fw, fh = self.canvas.GetSizeTuple()
            # By adding toolbar in sizer, we are able to put it at the bottom
            # of the frame - so appearance is closer to GTK version.
            # As noted above, doesn't work for Mac.
            self.toolbar.SetSize(wx.Size(fw, th))
            self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
        # update the axes menu on the toolbar
        self.toolbar.update()  
        
    def OnCloseWindow(self, event):
        self.Destroy()


    def PushAxesEventData(self, axes_data, x, event_data):
        axes_data.append([x, event_data])


    def GetSinFigure(self,
                     parent=None,
                     subplot=111,
                     figure=None):
        if not parent:
            parent = self
        
        # To test the y-range autoscale, we'll have an ever increasing amplitude
        x = arange(0,20*3.14159,0.01)
        print len(x),(10-1.0)/len(x)
        amp = arange(1,10,(10-1.0)/len(x))
        y = amp * sin(x)

        if figure == None:
            figure = Figure()

        axes = figure.add_subplot(subplot)
        axes_data = []
        self.axes_data[axes] = axes_data
        self.PushAxesEventData(axes_data, x, y)
        lines = axes.plot(x[:self.Xt],y[:self.Xt])
        axes.xaxis.set_major_formatter(matplotlib.ticker.FormatStrFormatter('%5.2f'))
        axes.yaxis.set_major_formatter(matplotlib.ticker.FormatStrFormatter('%5.2f'))
        axes.set_xlabel('Time (seconds)')
        axes.set_ylabel('Frequency shift (Hz)')
        axes.set_title('Test Plot')
        headings = ['sin(x)']
        leg = axes.legend(lines, headings, 'lower right')
        leg.draw_frame(False)
            
        return figure



class MyApp(wx.App):
    def OnInit(self):
        frame = AnalysisPlotFrame(None)
        self.SetTopWindow(frame)
        frame.Show(True)
        
        return True


if __name__ == '__main__':
   if 1:
       app = MyApp(redirect=0)
       app.MainLoop()
On Sep 15, 2006, at 1:06 PM, John Hunter wrote:

"Richard" == Richard Harvey Chapman <hchapman-matplotlib- [EMAIL PROTECTED]> writes:

    Richard> I'm using the latest matplotlib with wxPython 2.6.2.1 and
    Richard> the WxAGG backend. I have plotted a figure with 5
    Richard> subplots. I intentionally only plotted the first 10
    Richard> points of all of my data traces so I can simulate the
    Richard> look of real-time data. That is, I keep my xlim set to
    Richard> (now-60, now) for a window showing the last 60 seconds
    Richard> only. For the y-axis, I'd like it to autoscale, but it
    Richard> never does. I've tried calling
    Richard> axes.autoscale_view(scalex=False, scaley=True) for each
    Richard> subplot, but with no effect. For each update, I take each
    Richard> line in each subplot and update the x and y data with
    Richard> set_data(). I just add a few points every few seconds. Am
    Richard> I missing something? Why can't I get the y autoscaling to
    Richard> work? Autoscaling is on by default, and I've called
    Richard> get_autoscale_on() to confirm it.

Are you calling fig.canvas.draw() after the autoscale?

If you are still having troubles, please post a complete example....

JDH

R.


Attachment: PGP.sig
Description: This is a digitally signed message part

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to