SourceForge logo
SourceForge logo
Menu

matplotlib-devel

From: Antonio K. <ank...@gm...> - 2007年02月26日 20:31:45
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
- 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
From: John H. <jd...@gm...> - 2007年02月26日 21:07:16
Attachments: data_cursor.py
On 2/26/07, Antonio Kanaan <ank...@gm...> 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
> Mat...@li...
> https://lists.sourceforge.net/lists/listinfo/matplotlib-devel
>
From: Antonio K. <ank...@gm...> - 2007年02月27日 11:16:29
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: ka...@as...
Phone: 55,48,33319069 FAX : 55,48,33319946
On 2/26/07, John Hunter <jd...@gm...> wrote:
> On 2/26/07, Antonio Kanaan <ank...@gm...> 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
> > Mat...@li...
> > https://lists.sourceforge.net/lists/listinfo/matplotlib-devel
> >
>
>
From: Antonio K. <ank...@gm...> - 2007年03月09日 14:19:11
Attachments: t1
Hi everybody,
I made some progress with my data plotting program.
now I have stumbled in a new problem: I want to be able to move the
data cursor by pressing a key, say '.' to move right, ',' to move
left. I thought I was smart enough and added a method to the
DataCursor class:
 def moveto(self, event, ind):
 """
 """
 event.xdata = self.t[ind]
 event.ydata = self.y[ind]
 self.xstr = '%1.3f'%event.xdata
 self.ystr = '%1.3f'%event.ydata
 print event.xdata, event.ydata, event
 print self.xstr, self.ystr, event
 Cursor.onmove(self, event)
the event is caught in the main loop and sent of DataCursor.moveto
however, the cursor does not move at the end of this method as I had
hoped for. I suspect the reason is the reason is that this method is
getting a keyEvent, not a mouseEvent and then onmove doesn't like it.
the original Cursor class looks for mouseEvents, not for keyEvents.
What should I do? Is there a way to translate a keyEvent into a mouse
event, so I can fool the Cursor class? another more elegant solution?
Also, after I hit '.' or ',' the cursor goes off. I can turn it back
on hitting 1 and 2.
I attach a sample test code that uses essentially John's original code
plus this modification.
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: ka...@as...
Phone: 55,48,33319069 FAX : 55,48,33319946
moveto is called from the main loop when I hit either '.' or ','
On 2/26/07, John Hunter <jd...@gm...> wrote:
> On 2/26/07, Antonio Kanaan <ank...@gm...> 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
> > Mat...@li...
> > https://lists.sourceforge.net/lists/listinfo/matplotlib-devel
> >
>
>
From: John H. <jd...@gm...> - 2007年02月26日 21:09:13
On 2/26/07, Antonio Kanaan <ank...@gm...> wrote:
> 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.
I forgot to mention in my previous post -- as long as you use the blit
techniques embodied in the Cursor class in the example above and
discussed here:
http://www.scipy.org/Cookbook/Matplotlib/Animations
matplotlib will not redraw you figure each time.
JDH
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.
Thanks for helping keep SourceForge clean.
X





Briefly describe the problem (required):
Upload screenshot of ad (required):
Select a file, or drag & drop file here.
Screenshot instructions:

Click URL instructions:
Right-click on the ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)

More information about our ad policies

Ad destination/click URL:

AltStyle によって変換されたページ (->オリジナル) /