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.
Departamento de Fisica - Universidade Federal de Santa Catarina
CP 476 -- CEP 88040-900 -- Florianopolis -- SC -- Brasil
http://www.astro.ufsc.br/~kanaan e-mail: kanaan@...
Phone: 55,48,33319069 FAX : 55,48,33319946
On 2/26/07, John Hunter <jdh2358@...> wrote:
> On 2/26/07, Antonio Kanaan <ankanaan@...> 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
> 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.mpl_connect('key_press_event', keyevent)
> > - 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@...
> > https://lists.sourceforge.net/lists/listinfo/matplotlib-devel