我有點困惑matplotlib座標系(使用Jupyter筆記本進行交互式動畫)。如果你創建一個補丁,說一個圓,並使用set_transform()進行翻譯,我發現這個變換不是持久的,這意味着如果你再次使用相同的(x,y)變換來應用變換,圓不會因爲看起來Circle 位置在轉換後未得到更新,所以後續轉換應用於相同的原始色塊位置。我的問題是如何應用轉換,實際上不僅在應用後移動修補程序,還更新修補程序位置?假設我想要應用一系列翻譯,那麼圈子應該四處移動,而不是從原始位置來回擺動。以下是一個示例代碼:如何將永久座標轉換應用於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)。這意味着轉換不會實際更新補丁(圓)位置;它只是在圖形/軸上翻譯它。
問題2:我感到迷惑另一件事是,由代碼產生圈之上似乎有0.5的半徑的要求,但是通過(10,10)施加一個翻譯後它被翻譯少得多在圖中!就好像翻譯過程在應用之前被縮小了一些因素!!我沒有解釋這一點,它只是表明我不明白matplotlib座標系和轉換。另一方面,由plot()生成的作爲Line2D對象的對象可以通過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))'之前的任何內容都將被有效地忽略。 –