2017-06-29 79 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