2017-06-29 26 views
1

の等高線図を作成します。これは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 
関連する問題