In [1]:
import matplotlib.pyplot as plt
import numpy as np
%matplotlib
tp = [('sepalL','f8'),('sepalW','f8'),('petalL','f8'),('petalW','f8'),('species','S10')]
flower_data = np.loadtxt(open('flowers.csv','rb'),dtype=tp, skiprows=1, delimiter=',')
ctable = dict(setosa = 'r', versicolor = 'g', virginica = 'b')
carray = [ctable[x] for x in flower_data['species'] ]


Using matplotlib backend: MacOSX

In [5]:
from matplotlib.patches import Rectangle

class BrushingRectangle:
    def __init__(self,ax):
        self.rect = None
        self.press = False
        self.ax = ax
        self.cidpresss = self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press)
        self.cidrelease = self.ax.figure.canvas.mpl_connect('button_release_event', self.on_release)
        self.x0 = None
        self.x1 = None
        self.y0 = None
        self.y1 = None
    def on_press(self, event):
        xp = event.x
        yp = event.y
        self.press = True
        self.x0 = xp
        self.y0 = yp
        print 'press at', xp, yp

        
    def on_release(self, event):
        self.xl = event.x
        self.yl = event.y
        print 'release at', self.xl, self.yl
        x_lower = min(self.x0, self.x1)
        y_lower = min(self.y0, self.y1)
        width = abs(self.x0- self.x1)
        height = abs(self.y0- self.y1)
        print x_lower, y_lower, width, height
        self.ax.add_patch(self.rect)
        self.rect.set_xy((x_ll,y_ll))
        self.rect.set_width(width)
        self.rect.set_height(height)  
        self.ax.figure.canvas.draw()
        
    def disconnect(self):
        self.ax.figure.canvas.mpl_disconnect(self.cidpresss)
        self.ax.figure.canvas.mpl_disconnect(self.cidrelease)
    
features = ['sepalL']
f0, axx = plt.subplots(4,4, figsize = (12,8))
for i, row in enumerate(features):
    for j, col in enumerate(features):
        axx.scatter(flower_data[row], flower_data[col],alpha=0.5,s = 30, c=carray, edgecolors = 'none')
        brush = BrushingRectangle(axx)


 585 270
press at 322 406
release at 322 406
press at 510 311
release at 510 312
press at 327 432
release at 538 277
press at 590 257
release at 457 422
press at 534 484
release at 646 46
press at 602 137
release at 337 240
press at 350 325
release at 501 183
press at 602 279
release at 591 375
press at 767 290
release at

In [6]:
f0.axes


 632 460
Out[6]:
[<matplotlib.axes.AxesSubplot at 0x108f92750>]

In [ ]: