In Matplotlib, upon mouse click event, fill the plot on the right of the mouse click
<p>I am new to programming and was wondering if I could get some expert assistance from the very helpful community on here.</p>

<p>I am trying to create a mouse click event upon which the entire area of the plot to the right of the mouse click gets shaded. So, I want the mouse click to register the x-value, create a vertical line over that x-value, and shade the entire plot to the right of the vertical line.</p>

<p>I have 5 subplots showing distributions. I would like this mouse click event to trigger only on the 4th (PDF plot) and 5th (CDF plot) subplot. The purpose of this is to set margins and analyze the distributions.</p>

<p>See pic below</p>

<p><a href="http://i.stack.imgur.com/spwOw.jpg" rel="nofollow"><img src="http://i.stack.imgur.com/spwOw.jpg" alt="enter image description here"></a></p>

<p>I managed to write a code to perform this action but it is not updating (shading the area) the plot upon mouse click. Here's my code</p>

<pre><code>import numpy as np
from scipy.stats import norm, lognorm, uniform
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons, CheckButtons
from matplotlib.patches import Polygon


#####Mean and standard deviation#####

mu_a1 = 1
mu_b1 = 10
mu_c1 = -13
sigma_a1 =  0.14
sigma_b1 =  1.16
sigma_c1 =  2.87
mu_x01 = -11
sigma_x01 =  1.9

#####_____#####



#####Generating random data#####

a1 = 0.75*mu_a1 + (1.25 - 0.75)*sigma_a1*np.random.sample(10000)
b1 = 8*mu_b1 + (12 - 8)*sigma_b1*np.random.sample(10000)
c1 = -12*mu_c1 + 2*sigma_c1*np.random.sample(10000)
x01 = (-b1 - np.sqrt(b1**2 - (4*a1*c1)))/(2*a1)

#####_____#####



#####Creating Subplots#####

fig = plt.figure()
plt.subplots_adjust(left=0.13,right=0.99,bottom=0.05)

ax1 = fig.add_subplot(331)                                                  #Subplot 1
ax1.set_xlabel('a' , fontsize = 14)
ax1.grid(True)

ax2 = fig.add_subplot(334)                                                  #Subplot 2
ax2.set_xlabel('b', fontsize = 14)
ax2.grid(True)

ax3 = fig.add_subplot(337)                                                  #Subplot 3
ax3.set_xlabel('c', fontsize = 14)
ax3.grid(True)

ax4 = fig.add_subplot(132)                                                  #Subplot 4
ax4.set_xlabel('x0', fontsize = 14)
ax4.set_ylabel('PDF', fontsize = 14)
ax4.grid(True)

ax5 = fig.add_subplot(133)                                                  #Subplot 5
ax5.set_xlabel('x0', fontsize = 14)
ax5.set_ylabel('CDF', fontsize = 14)
ax5.grid(True)

#####_____#####



#####Plotting Distributions#####

[n1,bins1,patches] = ax1.hist(a1, bins=50, color = 'red',alpha = 0.5, normed = True)
[n2,bins2,patches] = ax2.hist(b1, bins=50, color = 'red',alpha = 0.5, normed = True)
[n3,bins3,patches] = ax3.hist(c1, bins=50, color = 'red',alpha = 0.5, normed = True)
[n4,bins4,patches] = ax4.hist(x01, bins=50, color = 'red',alpha = 0.5, normed = True)
ax4.axvline(np.mean(x01), color = 'black', linestyle = 'dashed', lw = 2)
dx = bins4[1] - bins4[0]
CDF = np.cumsum(n4)*dx
ax5.plot(bins4[1:], CDF, color = 'red')

#####_____#####



#####Event handler for button_press_event#####

def onclick(event):
    '''
    Event handler for button_press_event
    @param event MouseEvent
    '''
    global ix
    ix = event.xdata
    if ix is not None:
        print 'x = %f' %(ix)

    ax4.clear()
    ax5.clear()
    ax4.grid(True)
    ax5.grid(True)
    [n4,bins4,patches] = ax4.hist(x01, bins=50, color = 'red',alpha = 0.5, normed = True)
    ax4.axvline(np.mean(x01), color = 'black', linestyle = 'dashed', lw = 2)
    ax4.axvspan(ix, -90, facecolor='0.9', alpha=0.5)
    dx = bins4[1] - bins4[0]
    CDF = np.cumsum(n4)*dx
    ax5.plot(bins4[1:], CDF, color = 'red')
    ax5.axvspan(ix, -75, facecolor='0.9', alpha=0.5)  
    return ix

cid = fig.canvas.mpl_connect('button_press_event', onclick)

plt.show()

#####_____#####
</code></pre>

<p>Also, since I am using <code>axvspan</code>, it asks me to input xmin and xmax value. The xmin = mouse_click_value, and the xmax, I would like it to be till the end of the plot, what ever the end value may be. Currently, I am using a fixed value (-90 or -75 from the pic). This doesn't seem to work as the value of the variables change.</p>

<h1>For your main question:</h1>

<p>Just add:</p>

<pre><code>plt.draw()
</code></pre>

<p>after all the updates you do (i.e before the <code>return</code> of <code>onClick</code>).</p>

<h1>For your seconed question:</h1>

<p>You can use (on <code>ax5</code> for example):</p>

<pre><code>ax5.get_xlim()[1]
</code></pre>

<p>to get the <code>xmax</code> of <code>ax5</code></p>

python matplotlib mouseclick-event