2013-03-19 33 views
2

Matplotlib允許創建漂亮的交互式圖。按住鼠標左鍵的同時拖動可以讓我們平移左右或上下的情節。在按住鼠標右鍵的同時進行拖動,可以放大平行於拖動圖的方向的座標軸。我希望能夠通過拖動顏色條來複制這種行爲。當鼠標在彩條上方時,出現小手,但拖動不起作用。如果用鼠標左鍵拖動顏色條會改變顏色條範圍(保持cmin和cmax之間的差異不變)並用鼠標右鍵拖動會改變cmin和cmax之間的差異(例如縮放),那將會很不錯。任何方式可以做到這一點?matplotlib pan-zoom colorbar axis

到目前爲止,它看起來像解決方案將涉及某種形式的回調函數登記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,但我似乎無法弄清楚如何知道我在彩條或情節的其餘部分。

回答

3

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

那太好了。 (+1),但這只是解決問題的一個步驟。正如我所看到的,我們還有2個。我需要弄清楚如何獲得由'plt.pcolormesh'返回的'quadmesh'的句柄,然後我需要弄清楚如何在這個quadmesh上得到'set_clim'的當前值。關於如何完成這些事情的任何想法? – mgilson 2013-03-19 05:01:10

+0

我認爲沒有辦法通過event.inaxes獲取顏色條對象,所以您需要將顏色條對象傳遞給事件處理函數。您可以從顏色條獲得四分之一網格對象。 – HYRY 2013-03-19 05:25:28

+0

是的,我想這會起作用。我希望避免做這樣的事情,因爲我想在數字製作完成之後附加gui事件處理的東西(大部分)。但我會接受。感謝你在這方面的所有工作。 – mgilson 2013-03-19 05:26:46