在Matplotlib中,在鼠标单击事件时,填写鼠标单击右侧的图

时间:2016-09-05 16:53:41

标签: python matplotlib mouseclick-event

我是编程新手,想知道我是否可以从这里非常有帮助的社区获得一些专家帮助。

我正在尝试创建鼠标单击事件,鼠标单击右侧的绘图的整个区域都会被遮挡。因此,我希望鼠标单击以注册x值,在该x值上创建一条垂直线,并将整个绘图着色到垂直线的右侧。

我有5个子图显示分布。我希望这个鼠标点击事件仅在第4个(PDF图)和第5个(CDF图)子图上触发。这样做的目的是设置边距并分析分布。

见下图

enter image description here

我设法编写了一个代码来执行此操作,但是在点击鼠标时它没有更新(阴影区域)绘图。这是我的代码

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()

#####_____#####

此外,由于我使用axvspan,它要求我输入xmin和xmax值。 xmin = mouse_click_value和xmax,我希望它直到图的结尾,结果值可能是什么。目前,我使用固定值(图片中的-90或-75)。当变量的值发生变化时,这似乎不起作用。

1 个答案:

答案 0 :(得分:1)

对于您的主要问题:

只需添加:

plt.draw()

在您完成所有更新后(即return onClick之前)。

对于你的问题:

您可以使用(例如在ax5上):

ax5.get_xlim()[1]

获取xmax

ax5