2017-06-29 76 views
1

我創建了一個matplotlib輪廓圖與cs = ax.contour(x, y, z),它返回QuadContourSet對象。我用motion_notify_event攔截了鼠標事件,它允許獲取x值和y-值爲event.xdataevent.ydata。是否有可能爲鼠標光標的xy座標獲取插值的z - 對應於輪廓圖的值(來自返回的QuadContourSet對象)?我已經搜索,但沒有太多的文檔可用QuadContourSet。或者我必須以某種方式從z值的原始數組手動計算它?我認爲在一般情況下這可能不會很容易,例如對數縮放軸等。或者是否有任何提示可以幫助我?matplotlib輪廓圖插值z值

回答

0

最後,我必須自己插值。就我使用的線性軸而言,即使對於非常稀疏的網格,這種方法也可以很好地工作。請注意,下面是我對雙線性插值的天真嘗試,如果你碰巧有更好的算法(請不要像scipy等其他依賴),請張貼它。我還沒有在對數座標軸上測試過這個...

# note that z-data are indexed with pair (y, x) rather than (x, y) 
pos = event.inaxes.transAxes.inverted().transform([event.x, event.y]) 
# relative coordinates in <0, 1> 
rx = pos[0] * (self.__data.shape[1] - 1) 
ry = pos[1] * (self.__data.shape[0] - 1) 
# calculate the corner coordinates 
rxLow, rxHigh = math.floor(rx), math.ceil(rx) 
ryLow, ryHigh = math.floor(ry), math.ceil(ry) 
# weights based on the distance 
wxLow, wyLow = 1.0 - rx + rxLow, 1.0 - ry + ryLow 
wxHigh, wyHigh = 1.0 - rxHigh + rx, 1.0 - ryHigh + ry 
# adjust in case rxLow == rxHigh or ryLow == ryHigh 
wx = wxLow + wxHigh 
wy = wyLow + wyHigh 
wxLow /= wx 
wxHigh /= wx 
wyLow /= wy 
wyHigh /= wy 
# get the corner data 
z00 = self.__data[ryLow, rxLow] 
z01 = self.__data[ryHigh, rxLow] 
z10 = self.__data[ryLow, rxHigh] 
z11 = self.__data[ryHigh, rxHigh] 
# interpolate 
zxLow = z00 * wyLow + z01 * wyHigh 
zxHigh = z10 * wyLow + z11 * wyHigh 
z = zxLow * wxLow + zxHigh * wxHigh # the interpolated value