Hi,
I am trying to use matplotlib to visually explore some data. I started
from the "event_handling example code: data_browser.py" example, but
wanted to go a bit further. The idea is to have two plots and an image
linked together. The first plot represents a measure calculated from
an image region at different times of the day. Selecting one of this
measures shows the corresponding image, and some other measure calculated
from the individual pixels. Further on, selecting in the image or the
second plot should highlight the corresponding point in the plot or pixel
on the image, respectively (That is, the first plot is linked to the image,
and the image and the second plot are linked together).
My problem is that on the function being called upon and event, I always
get events generated by the image, even when the moused was clicked on one of
the other plots. The plots behave ok.
The coded below is a simplified functional version (the measures here are
trivial, and I haven't included the actions when the user selects the image or
the second plot), which exhibits this behavior. What I see when executing this
code is for example:

Actions (click on)              Results (from the print statement on the
onpick() function)

plot1                   plot1
                        image2

image2                  image2

plot3                   plot3
                        image2

Am I doing something wrong? I am new to both python and matplotlib, so if you
see something that could be done in a better way, please tell me.

Jorges


----- Test code -----
import os
import sys
import glob
import re
import fnmatch
import Image as im
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import scipy as sp
import scipy.stats

class LCRBrowser():
    """
    Permits to visualize log chromaticity ratios and related things for
    analysing static images taken at throughout a period of time
    """
    def __init__(self, data):
        # Initialize instance attributes
        self.lcr = np.asarray(map((lambda x: x['lcr']), data))
        self.lcr_ind = np.asarray(map((lambda x: x['lcr_ind']), data))
        self.img = np.asarray(map((lambda x: x['img']), data))
        self.lastind = 0
        # Initial drawing and picking init
        self.fig = plt.figure()
        self.ax1 = self.fig.add_subplot(311)
        self.ax2 = self.fig.add_subplot(312)
        self.ax3 = self.fig.add_subplot(313)
        self.plot1, = self.ax1.plot(self.lcr, 'o', picker=5)
        self.selected, = self.ax1.plot([self.lcr[0]], 'o', ms=12, alpha=0.4,
                                  color='yellow', visible=False)
        self.img2 = self.ax2.imshow(self.img[0], visible=True, picker=2,\
                                    interpolation='nearest')
        self.plot3, = self.ax3.plot(self.lcr_ind[0][:], 'o', visible=True, 
picker=5)
        print type(self.plot3)
        self.fig.canvas.mpl_connect('pick_event', self.onpick)
        self.fig.canvas.draw()

    def onpick(self, event):
        x2 = event.mouseevent.ydata
        if event.artist == self.plot1:
            print 'plot1\n'
            N = len(event.ind)
            if not N: return True
            distances = x2-self.lcr[event.ind]
            indmin = distances.argmin()
            dataind = event.ind[indmin]
            self.lastind = dataind
        elif event.artist == self.img2:
            print 'img2\n'
        elif event.artist == self.plot3:
            print 'plot3\n'
        else:
            print 'didn\'t detect artist'
            print str(event.artist)
            return True
        self.update()

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

        ind = self.lastind
        self.img2.set_data(self.img[ind])
        a = self.lcr_ind[ind][:]
        self.plot3.set_data((range(len(a)), a))
        self.fig.canvas.draw()

def main():
    results = []
    for name in range(5):

        img = np.random.rand(5,4,3)
        lcr = sp.stats.gmean(np.mean(np.mean(img, 0), 0))
        lcr_ind = sp.stats.gmean(img, 2).reshape(-1,1)
        result = {'lcr': lcr, 'lcr_ind':lcr_ind, 'img':img}
        results.append(result)

    LCRBrowser(results)

if __name__ == '__main__':
    main()

----- code end -----



      

------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, & 
iPhoneDevCamp asthey present alongside digital heavyweights like Barbarian
Group, R/GA, & Big Spaceship. http://www.creativitycat.com 
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to