2017-03-24 34 views
2

我想使用rotate_deg_around()函數在其左下角旋轉matplotlib矩形修補程序對象。但是,該補丁總是圍繞某個不同的點旋轉。任何想法爲什麼rotate_deg_around()函數沒有產生期望的結果?無法使用rotate_deg_around()旋轉關於特定點的matplotlib修補程序對象

我的代碼如下:

f,(ax1) = plt.subplots(1,1,figsize=(6,6)) 
f.subplots_adjust(hspace=0,wspace=0) 

ts = ax1.transData 
coords = ts.transform([1,1]) 
tr = mpl.transforms.Affine2D().rotate_deg_around(coords[0], coords[1], 10) 
t = ts + tr 
rec0 = patches.Rectangle((1,1),3,2,linewidth=1,edgecolor='r',facecolor='none') 
ax1.add_patch(rec0) 
#Rotated rectangle patch 
rect1 = patches.Rectangle((1,1),3,2,linewidth=1,edgecolor='b',facecolor='none',transform=t) 
ax1.add_patch(rect1) 
# Rectangles lower left corner 
plt.plot([1], [1], marker='o', markersize=3, color="green") 

plt.grid(True) 
ax1.set_xlim(0,6) 
ax1.set_ylim(-1,4) 

導致如下圖所示:

enter image description here

我按照 Unable to rotate a matplotlib patch object about a specific point using rotate_around()

任何幫助深表感謝。

回答

2

簡短的回答是:您需要在進行轉換之前更改軸限制。否則,在將限制設置爲不同的情況之前,您可以在位置(1,1)(右上角)上的畫布上旋轉一個點。


更好的答案實際上是以下內容:爲了繞數據座標中的一個點,一個不應使用的顯示座標旋轉中心的定義,但確切的數據座標自己。

因此,而不是第一轉換到顯示座標,然後旋轉,應該首先旋轉,然後變換到顯示座標

ts = ax1.transData 
coords = [1,1] 
tr = matplotlib.transforms.Affine2D().rotate_deg_around(coords[0],coords[1], 10) 
t = tr + ts 

完整代碼(其中如果並且其中軸限制設置不要緊,和這是圖調整等的影響無關):

import matplotlib.pyplot as plt 
import matplotlib 

f,(ax1) = plt.subplots(1,1,figsize=(3,3)) 
f.subplots_adjust(hspace=0,wspace=0) 


ts = ax1.transData 
coords = [1,1] 
tr = matplotlib.transforms.Affine2D().rotate_deg_around(coords[0],coords[1], 10) 
t = tr + ts 
rec0 = matplotlib.patches.Rectangle((1,1),3,2,linewidth=1,edgecolor='r',facecolor='none') 
ax1.add_patch(rec0) 
#Rotated rectangle patch 
rect1 = matplotlib.patches.Rectangle((1,1),3,2,linewidth=1,edgecolor='b',facecolor='none',transform=t) 
ax1.add_patch(rect1) 
# Rectangles lower left corner 
plt.plot([1], [1], marker='o', markersize=3, color="green") 

plt.grid(True) 
ax1.set_xlim(0,6) 
ax1.set_ylim(-1,4) 

plt.show() 

enter image description here

+0

這是有道理的,現在,它的工作原理(我的身材現在是相同爲t他是你在這裏提供的)。謝謝你的時間。 –

+1

我更新了答案,因爲來自其他問題的解決方案實際上並不理想。 – ImportanceOfBeingErnest

+0

更好!再次感謝。 –

相關問題