在matplotb中确定调用事件的轴

时间:2016-01-11 20:05:28

标签: python matplotlib

这必须在某处回答,但我似乎找不到任何东西。总之...

我有两个事件和处理程序:

  1. 第一个响应图像画布上的点击,并在图像上绘制点。
  2. 第二个响应按钮点击并运行一些代码。
  3. 我的问题是注册到onclick'的'button_press_event功能。触发图像轴上的单击并单击按钮轴。例如,下面的代码将在单击按钮时在图像轴上打印和绘制点(使用按钮轴的坐标)。它们出现在图像轴的左上角。

    有没有办法确定调用事件的轴,以便在单击按钮时调用onclick ,但在图像时调用 点击轴?

    import matplotlib.pyplot as plt
    import numpy as np
    from matplotlib.widgets import Button
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    
    ax.imshow(np.random.rand(512,512), cmap=plt.cm.gray)
    ax.set_xlim(0,512)
    ax.set_ylim(512,0)
    
    buttonax = plt.axes([0.8,0.025,0.1,0.04])
    button = Button(buttonax, 'click')
    
    def onclick(event):
        x,y = event.xdata, event.ydata
        print x,y
        # plot the points
        ax.plot(x, y, 'or', ms=7)
        plt.draw()
    
    def button_func(event):
        print "button is clicked"
    
    fig.canvas.mpl_connect('button_press_event',onclick)
    button.on_clicked(button_func)
    
    plt.show()
    

1 个答案:

答案 0 :(得分:2)

Matplotlib事件存储inaxes属性,该属性是事件发生时的父Axes实例,如果事件不在轴上,则存储None

在您的情况下,您要检查类似于以下内容的内容:

if event.inaxes is ax:
    ...

有一点需要注意:如果你有重叠的轴(例如插入轴或任何涉及twinx / twiny的东西),只有上轴会响应事件(& #34;鞋面"就zorder而言,如果我没记错的话)。如果事件结束,您将无法获得所有轴的列表,或者如果它超过一个轴,则无法获得多个回调。