Search code examples
pythonmatplotlibwxpythonmatplotlib-basemap

matplotlib mouseclick event in pie chart


Is there a way in matplotlib and Python to return the value/label clicked in a pie chart. For example if user clicks on sliver A of pie chart, return value A. If user clicks on sliver B of B pie chart, return value B.


Solution

  • from matplotlib import pyplot as plt
    # make a square figure and axes
    plt.figure(figsize=(6,6))
    ax = plt.axes([0.1, 0.1, 0.8, 0.8])
    
    labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
    fracs = [15,30,45, 10]
    
    explode=(0, 0.05, 0, 0)
    p = plt.pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
    plt.title('Raining Hogs and Dogs', bbox={'facecolor':'0.8', 'pad':5})
    
    w = p[0][0]
    plt.show() 
    
    class PieEventHandler:
        def __init__(self,p):
            self.p = p
            self.fig = p[0].figure
            self.ax = p[0].axes
            self.fig.canvas.mpl_connect('button_press_event', self.onpress)
    
        def onpress(self, event):
            if event.inaxes!=self.ax:
                return
    
            for w in self.p:
                (hit,_) = w.contains(event)
                if hit:
                    print w.get_label()
    
    
    handler = PieEventHandler(p[0])
    

    references:

    Color values in imshow for matplotlib?

    http://matplotlib.org/examples/pylab_examples/pie_demo.html