3

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)

イベントはここに記載されているようですが、カラーバーにいるのか、プロットの残りの部分にいるのかを知る方法がわかりません。

4

1 に答える 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()
于 2013-03-19T04:51:12.130 に答える