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 [email protected] https://lists.sourceforge.net/lists/listinfo/matplotlib-devel
data_cursor.py
Description: Binary data
------------------------------------------------------------------------- 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 [email protected] https://lists.sourceforge.net/lists/listinfo/matplotlib-devel
