Hi John,

thanks *very much* for your message.  This is exactly what I want.
And it is going to be a lot less work than it was in C / Xlib.   Even
re-reading that code was a nightmare, adding new features would be
nearly impossible :-)

I will now start redoing all my code using matplotlib.

cheers

Antonio

Antonio Kanaan
Departamento de Fisica - Universidade Federal de Santa Catarina
CP 476 --  CEP 88040-900  --  Florianopolis  --  SC  --  Brasil
http://www.astro.ufsc.br/~kanaan   e-mail: [EMAIL PROTECTED]
Phone: 55,48,33319069                       FAX  : 55,48,33319946


On 2/26/07, John Hunter <[EMAIL PROTECTED]> wrote:
> On 2/26/07, Antonio Kanaan <[EMAIL PROTECTED]> wrote:
> > Hi folks,
> >
> > I am planning to re-write a data viewer program I wrote ages ago using C + 
> > Xlib.
> >
> > This program allows me to plot on the same window several graphs (time
> > versus brightness - I work on variable stars).  They all share the
> > same independent variable (time passes the same for everybody).
> >
> > I can scroll and zoom the graphs both in X and Y.  When I scroll/zoom
> > in X all plots suffer the same action.  Y scrolling/zooming may be
> > done for each plot.
> >
> > Now the question: I need a data cursor, by that I mean some marker
> > that sits on top of a point and which may be moved forward/backward by
> > pressing a key.  Matplotlib has a mouse cursor that gives me the
> > cursor coordinates, but it doesn't
>
> This isn't too bad actually -- you can subclass the existing Cursor
> class to override the xdata and ydata atrributes to insure that the
> cursor sits only on your data points.  The example below uses the
> cursor class to overrride the toolbar formatting, and shows you how to
> toggle the visibility of multiple cursors in multiple axes with shared
> x axes.  I'll also attach it in case the mail system mangles the
> newlines.  Take a look at the MultiCursor in
> the widgets module, you might be able to do a similar trick there to
> have common x cursoring across multiple axes.
>
> from pylab import figure, show, nx
> from matplotlib.widgets import Cursor
>
> class DataCursor(Cursor):
>     def __init__(self, t, y, ax, useblit=True, **lineprops):
>         Cursor.__init__(self, ax, useblit=True, **lineprops)
>         self.y = y
>         self.t = t
>         self.xstr = ''
>         self.ystr = ''
>
>     def onmove(self, event):
>         """
>         we override event.xdata to force it to snap-to nearest data
>         item here we assume t is sorted and I'll use searchsorted
>         since it is a little faster, but you can plug in your nearest
>         neighbor routine, eg to grab the closest x,y point to the
>         cursor
>         """
>         xdata = event.xdata
>         ind = nx.searchsorted(self.t, xdata)
>         ind = min(len(self.t)-1, ind)
>         event.xdata = self.t[ind]
>         event.ydata = self.y[ind]
>         self.xstr = '%1.3f'%event.xdata
>         self.ystr = '%1.3f'%event.ydata
>         Cursor.onmove(self, event)
>
>     def fmtx(self, x):
>         return self.xstr
>
>     def fmty(self, y):
>         return self.ystr
>
> fig = figure()
> ax1 = fig.add_subplot(211)
> ax2 = fig.add_subplot(212, sharex=ax1) # connect x pan/zoom events
>
> t = nx.cumsum(nx.rand(20))
> s1 = nx.mlab.rand(len(t))
> s2 = nx.mlab.rand(len(t))
>
> ax1.plot(t, s1, 'go')
> ax2.plot(t, s2, 'bs')
> ax1.set_title("Press 1 for upper cursor and 2 for lower cursor")
> cursor1 = DataCursor(t, s1, ax1, useblit=True, color='red', linewidth=2 )
>
> # we'll let the cursor do the toolbarformatting too.
> ax1.fmt_xdata = cursor1.fmtx
> ax1.fmt_ydata = cursor1.fmty
>
> cursor2 = DataCursor(t, s2, ax2, useblit=True, color='red', linewidth=2 )
> ax2.fmt_xdata = cursor2.fmtx
> ax2.fmt_ydata = cursor2.fmty
>
>
> # now we'll control the visibility of the cursor; turn off cursor2 by default
> cursor2.visible = False
>
> def keyevent(event):
>     cursor1.visible = event.key=='1'
>     cursor2.visible = event.key=='2'
>     fig.canvas.draw()
>
> fig.canvas.mpl_connect('key_press_event', keyevent)
> show()
>
>
> >
> > - sit on top of my points and therefore doesn't give me the exact
> > value of that point
> > - allow me to move from one point to the next
> > - allow me to change which graph I want the cursor sitting on
> >
> > I thought of drawing my own cursor, deleting it and moving to the next
> > point . It seems this would take forever as (far as I understand)
> > matplotlib will redo the entire plot each time I do this.
> >
> > How hard is it for the developers to include a built in data cursor in
> > a similar fashion to the mouse cursor now available.  I am affraid
> > this isn't too easy, I don't know any plotting program that has one
> > like what I need.
> >
> > thanks for your attention,
> >
> > Antonio Kanaan
> >
> > -------------------------------------------------------------------------
> > Take Surveys. Earn Cash. Influence the Future of IT
> > Join SourceForge.net's Techsay panel and you'll get the chance to share your
> > opinions on IT & business topics through brief surveys-and earn cash
> > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> > _______________________________________________
> > Matplotlib-devel mailing list
> > Matplotlib-devel@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/matplotlib-devel
> >
>
>

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to