plot data point browsing

I just learned about the (new?) picker features in matplotlib. That is a
fantastic development!
Someone else mentioned about having a problem though when the points are
clustered together, which brings me to my question:

Is there a way to "browse" through the data points using the tab key? What I
envision is that a particular point would have a "focus" because it had
previously been picked, and then you would press a key (such as tab) and it
would move the focus to another point, in essence picking another point in
the data set.

Can that be done in a straight-forward way? Thanks,

j

···

--
View this message in context: http://www.nabble.com/plot-data-point-browsing-tf3922973.html#a11124244
Sent from the matplotlib - users mailing list archive at Nabble.com.

I just learned about the (new?) picker features in matplotlib. That is a
fantastic development!
Someone else mentioned about having a problem though when the points are
clustered together, which brings me to my question:

Is there a way to "browse" through the data points using the tab key? What I
envision is that a particular point would have a "focus" because it had
previously been picked, and then you would press a key (such as tab) and it
would move the focus to another point, in essence picking another point in
the data set.

The TAB key is a little problematic, because it is already used by
some GUI toolkits, but this kind of thing is fairly easy to do. MPL
gives you access to the button press events, key press events, etc, so
all you have to do is connect up the callbacks to what you want your
figure to do.

Here is an example of a "data browser" which uses 'n' and 'p' to move
through the next and previous points after a mouse select.

import numpy as npy
from pylab import figure, show

X = npy.random.rand(100, 200)
xs = npy.mean(X, axis=1)
ys = npy.std(X, axis=1)

fig = figure()
ax = fig.add_subplot(211)
ax.set_title('click on point to plot time series')
line, = ax.plot(xs, ys, 'o', picker=5) # 5 points tolerance
ax2 = fig.add_subplot(212)

class PointBrowser:
    """
    Click on a point to select and highlight it -- the data that
    generated the point will be shown in the lower axes. Use the 'n'
    and 'p' keys to browse through the next and pervious points
    """
    def __init__(self):
        self.lastind = 0

        self.text = ax.text(0.05, 0.95, 'selected: none',
                            transform=ax.transAxes, va='top')
        self.selected, = ax.plot([xs[0]], [ys[0]], 'o', ms=12, alpha=0.4,
                                  color='yellow', visible=False)

    def onpress(self, event):
        if self.lastind is None: return
        if event.key not in ('n', 'p'): return
        if event.key=='n': inc = 1
        else: inc = -1

        self.lastind += inc
        self.lastind = npy.clip(self.lastind, 0, len(xs)-1)
        self.update()

    def onpick(self, event):

       if event.artist!=line: return True

       N = len(event.ind)
       if not N: return True

       # the click locations
       x = event.mouseevent.xdata
       y = event.mouseevent.ydata

       distances = npy.hypot(x-xs[event.ind], y-ys[event.ind])
       indmin = distances.argmin()
       dataind = event.ind[indmin]

       self.lastind = dataind
       self.update()

    def update(self):
        if self.lastind is None: return

        dataind = self.lastind

        ax2.cla()
        ax2.plot(X[dataind])

        ax2.text(0.05, 0.9, 'mu=%1.3f\nsigma=%1.3f'%(xs[dataind], ys[dataind]),
                 transform=ax2.transAxes, va='top')
        ax2.set_ylim(-0.5, 1.5)
        self.selected.set_visible(True)
        self.selected.set_data(xs[dataind], ys[dataind])

        self.text.set_text('selected: %d'%dataind)
        fig.canvas.draw()

browser = PointBrowser()

fig.canvas.mpl_connect('pick_event', browser.onpick)
fig.canvas.mpl_connect('key_press_event', browser.onpress)

show()

pick_event_demo3.py (2.17 KB)

···

On 6/14/07, jkitchin <jkitchin@...1648...> wrote:

Can that be done in a straight-forward way? Thanks,

j
--
View this message in context: http://www.nabble.com/plot-data-point-browsing-tf3922973.html#a11124244
Sent from the matplotlib - users mailing list archive at Nabble.com.

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

This great! Thanks for the speedy response. I will have to try this out on a
large dataset.

I have already seen an issue when clicking near two points that are close
together, then the browser selects both points. but the key browsing helps
alot to get around that. This is a great starting point for our analysis
though. Thanks again.

John Hunter-4 wrote:

···

On 6/14/07, jkitchin <jkitchin@...1648...> wrote:

I just learned about the (new?) picker features in matplotlib. That is a
fantastic development!
Someone else mentioned about having a problem though when the points are
clustered together, which brings me to my question:

Is there a way to "browse" through the data points using the tab key?
What I
envision is that a particular point would have a "focus" because it had
previously been picked, and then you would press a key (such as tab) and
it
would move the focus to another point, in essence picking another point
in
the data set.

The TAB key is a little problematic, because it is already used by
some GUI toolkits, but this kind of thing is fairly easy to do. MPL
gives you access to the button press events, key press events, etc, so
all you have to do is connect up the callbacks to what you want your
figure to do.

Here is an example of a "data browser" which uses 'n' and 'p' to move
through the next and previous points after a mouse select.

import numpy as npy
from pylab import figure, show

X = npy.random.rand(100, 200)
xs = npy.mean(X, axis=1)
ys = npy.std(X, axis=1)

fig = figure()
ax = fig.add_subplot(211)
ax.set_title('click on point to plot time series')
line, = ax.plot(xs, ys, 'o', picker=5) # 5 points tolerance
ax2 = fig.add_subplot(212)

class PointBrowser:
    """
    Click on a point to select and highlight it -- the data that
    generated the point will be shown in the lower axes. Use the 'n'
    and 'p' keys to browse through the next and pervious points
    """
    def __init__(self):
        self.lastind = 0

        self.text = ax.text(0.05, 0.95, 'selected: none',
                            transform=ax.transAxes, va='top')
        self.selected, = ax.plot([xs[0]], [ys[0]], 'o', ms=12, alpha=0.4,
                                  color='yellow', visible=False)

    def onpress(self, event):
        if self.lastind is None: return
        if event.key not in ('n', 'p'): return
        if event.key=='n': inc = 1
        else: inc = -1

        self.lastind += inc
        self.lastind = npy.clip(self.lastind, 0, len(xs)-1)
        self.update()

    def onpick(self, event):

       if event.artist!=line: return True

       N = len(event.ind)
       if not N: return True

       # the click locations
       x = event.mouseevent.xdata
       y = event.mouseevent.ydata

       distances = npy.hypot(x-xs[event.ind], y-ys[event.ind])
       indmin = distances.argmin()
       dataind = event.ind[indmin]

       self.lastind = dataind
       self.update()

    def update(self):
        if self.lastind is None: return

        dataind = self.lastind

        ax2.cla()
        ax2.plot(X[dataind])

        ax2.text(0.05, 0.9, 'mu=%1.3f\nsigma=%1.3f'%(xs[dataind],
ys[dataind]),
                 transform=ax2.transAxes, va='top')
        ax2.set_ylim(-0.5, 1.5)
        self.selected.set_visible(True)
        self.selected.set_data(xs[dataind], ys[dataind])

        self.text.set_text('selected: %d'%dataind)
        fig.canvas.draw()

browser = PointBrowser()

fig.canvas.mpl_connect('pick_event', browser.onpick)
fig.canvas.mpl_connect('key_press_event', browser.onpress)

show()

Can that be done in a straight-forward way? Thanks,

j
--
View this message in context:
http://www.nabble.com/plot-data-point-browsing-tf3922973.html#a11124244
Sent from the matplotlib - users mailing list archive at Nabble.com.

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

import numpy as npy
from pylab import figure, show

X = npy.random.rand(100, 200)
xs = npy.mean(X, axis=1)
ys = npy.std(X, axis=1)

fig = figure()
ax = fig.add_subplot(211)
ax.set_title('click on point to plot time series')
line, = ax.plot(xs, ys, 'o', picker=5) # 5 points tolerance
ax2 = fig.add_subplot(212)

class PointBrowser:
    """
    Click on a point to select and highlight it -- the data that
    generated the point will be shown in the lower axes. Use the 'n'
    and 'p' keys to browse through the next and pervious points
    """
    def __init__(self):
        self.lastind = 0

        self.text = ax.text(0.05, 0.95, 'selected: none',
                            transform=ax.transAxes, va='top')
        self.selected, = ax.plot([xs[0]], [ys[0]], 'o', ms=12, alpha=0.4,
                                  color='yellow', visible=False)
        
    def onpress(self, event):
        if self.lastind is None: return
        if event.key not in ('n', 'p'): return
        if event.key=='n': inc = 1
        else: inc = -1
        
        self.lastind += inc
        self.lastind = npy.clip(self.lastind, 0, len(xs)-1)
        self.update()
        
    def onpick(self, event):

       if event.artist!=line: return True

       N = len(event.ind)
       if not N: return True

       # the click locations
       x = event.mouseevent.xdata
       y = event.mouseevent.ydata

       distances = npy.hypot(x-xs[event.ind], y-ys[event.ind])
       indmin = distances.argmin()
       dataind = event.ind[indmin]

       self.lastind = dataind
       self.update()

    def update(self):
        if self.lastind is None: return

        dataind = self.lastind

        ax2.cla()
        ax2.plot(X[dataind])

        ax2.text(0.05, 0.9, 'mu=%1.3f\nsigma=%1.3f'%(xs[dataind],
ys[dataind]),
                 transform=ax2.transAxes, va='top')
        ax2.set_ylim(-0.5, 1.5)
        self.selected.set_visible(True)
        self.selected.set_data(xs[dataind], ys[dataind])

        self.text.set_text('selected: %d'%dataind)
        fig.canvas.draw()

browser = PointBrowser()

fig.canvas.mpl_connect('pick_event', browser.onpick)
fig.canvas.mpl_connect('key_press_event', browser.onpress)

show()

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

--
View this message in context: http://www.nabble.com/plot-data-point-browsing-tf3922973.html#a11129890
Sent from the matplotlib - users mailing list archive at Nabble.com.