matplotlib 平移缩放 彩条 轴

3 投票
1 回答
1933 浏览
提问于 2025-04-17 19:35

Matplotlib 是一个可以创建漂亮互动图表的工具。按住左键拖动鼠标可以让我们在图表中左右或上下移动。按住右键拖动则可以在你拖动的方向上放大图表的某个部分。我希望能通过拖动颜色条来实现类似的功能。当鼠标移动到颜色条上时,会出现一个小手的图标,但拖动并没有任何反应。如果能在颜色条上按住左键拖动来改变颜色条的范围(保持最小值和最大值之间的差距不变),而按住右键拖动来改变这个差距(比如放大)就好了。不知道有没有办法实现这个功能呢?

到目前为止,看起来解决这个问题需要用到某种回调函数,通过 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)

而且这些事件的详细信息可以在 这里找到,但我还是搞不清楚怎么判断自己是在颜色条上还是在图表的其他部分。

1 个回答

4

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

撰写回答