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