【问题标题】:matplotlib pan-zoom colorbar axismatplotlib pan-zoom colorbar 轴
【发布时间】:2013-03-07 14:52:06
【问题描述】:

Matplotlib 允许创建漂亮的交互式绘图。在按住鼠标左键的同时进行拖动可以让我们左右或上下平移绘图。按住鼠标右键进行拖动可以让我们在与拖动绘图方向平行的轴上进行缩放。我希望能够通过拖动颜色条来复制这种行为。当鼠标悬停在颜色条上时,会出现小手,但拖动不起作用。如果用鼠标左键沿着颜色条拖动会改变颜色条范围(保持 cmin 和 cmax 之间的差异不变)并用鼠标右键拖动会改变 cmin 和 cmax 之间的差异(例如缩放),那就太好了有什么办法可以做到这一点?

到目前为止,该解决方案似乎将涉及fig.canvas.mpl_connect('button_press_event', func) 注册的某种形式的回调函数。例如:

def onclick(event):
    tb = plt.get_current_fig_manager().toolbar
    print repr(tb.mode),bool(tb.mode)
    if tb.mode != '':
        print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
            event.button, event.x, event.y, event.xdata, event.ydata)

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

看起来这些事件被描述为here,但我似乎不知道如何知道我是在颜色栏上还是在情节的其余部分上。

【问题讨论】:

    标签: python matplotlib interactive


    【解决方案1】:

    event.inaxes是当前事件的斧头:

    import numpy as np
    from matplotlib import pyplot as plt
    from functools import partial
    
    def onclick_cbar(cbar, event):
        if event.inaxes is cbar.ax:
            print cbar.mappable
            print cbar.mappable.get_clim()
            print event.xdata, event.ydata
    
    fig = plt.figure()
    y, x = np.mgrid[-1:1:100j, -1:1:100j]
    z = np.sin(x**2 + y**2)
    pcm = plt.pcolormesh(x, y, z)
    cbar = plt.colorbar()
    cid = fig.canvas.mpl_connect('button_press_event', partial(onclick_cbar, cbar))
    plt.show()
    

    【讨论】:

    • 太棒了。 (+1),但这只是解决问题的第一步。在我看来,我们还有 2 个。我需要弄清楚如何处理plt.pcolormesh 返回的quadmesh,然后我需要弄清楚如何在该四边形网格上获取set_clim 的当前值。关于如何完成这些事情的任何想法?
    • 我认为没有办法通过event.inaxes获取colorbar对象,所以需要将colorbar对象传递给事件处理函数。您可以从 colorbar 获取 quadmesh 对象。
    • 是的,我想这会奏效。我希望避免做类似的事情,因为我想在图已经制作好之后附加 gui 事件处理的东西(大部分情况下)。但我会接受的。感谢您为此所做的所有工作。
    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2013-06-10
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多