私はmatplotlib座標系(インタラクティブなアニメーションのためにJupyterノートブックで使用しています)で少し混乱しています。 set_transform()を使用してパッチを作成してサークルを翻訳し、それを翻訳すると、変換が永続的ではないことがわかります。つまり、同じ(x、y)シフトで変換を再度適用すると、サークルは円ポジションが変換後に更新されないように見えるので、次の変換が同じ元のパッチ位置に適用されるため、移動します。私の質問は、実際に適用された後に実際にパッチを移動するだけでなく、パッチの位置も更新する変換を適用する方法です。一連の翻訳を適用したいとしたら、円は元の位置から前後に動かないようにしてください。ここではサンプルコードです:Matplotlibのパッチに永続座標変換を適用するにはどうすればいいですか?
%import matplotlib
%matplotlib notebook
fig = plt.figure()
ax = fig.add_subplot(111, xlim=(-10, 10), ylim=(-10, 10))
c = ax.add_patch(plt.Circle((x, y), radius=0.5)
c.set_transform(ax.transData + mpl.transforms.Affine2D().translate(-5,-5))
c.set_transform(ax.transData + mpl.transforms.Affine2D().translate(10,10))
あなたがこれを実行する場合は、あなたが最初の翻訳をコメントアウトすると、円の最終的な位置に影響を与えないことがわかります。私は、円の中心の最終的な位置が(5,5)NOT(10,10)であると予想していたでしょう。つまり、変換によって実際にパッチ(円)の位置は更新されません。 Figure/Axesで変換します。
質問2:私は混乱を見つけるもう一つは、要求されるように、コードによって生成円は上記のそれははるかに少ない翻訳されしかし、(10,10)で翻訳を適用した後、0.5の半径を持っているように見えるということです図の中に!!あたかも翻訳シフトが適用される前に何らかの要素によって縮小されたかのように!私はこれについて何の説明もなく、matplotlib座標系と変換を理解していないことを示しています。
一方Line2Dオブジェクトであるplot()によって生成されたオブジェクトは、set_data()メソッドによって変換されます。このメソッドは、オブジェクトの位置を次のように更新します(上のコードセグメントのfigオブジェクトとaxオブジェクトを想定します) :
L, = ax.plot(0, 0, 'ro', ms=8)
sx = 10 # shift in x
sy = 10 # shift in y
L.set_data(L.get_data()[0] + sx, L.get_data()[1] + sy)
matplotlibパッチで同じことを行う方法がわかりませんか?
あなたはhttp://matplotlib.org/users/transforms_tutorial.htmlを読んでいますか? –
質問1の最初の部分については、 'set_transform'は変換を追加しません。マトリックス全体をリセットします。つまり、 'c.set_transform(ax.transData + mpl.transforms.Affine2D()。translate(10,10))'の前のものは実質的に無視されます。 –