我想你可能會對感興趣轉型。使用transform
方法,可以將「數據」單位中的點轉換爲顯示單位。有關詳細信息,請參閱transformation tutorial。
下面我有一個例子,它包含一個填充整個圖的座標軸,所以理解轉換有點容易。我在散點圖中設置了三個點,然後,我將這些數據用於繪圖,並使用變換得到三個點中每個點的對應像素點。
import matplotlib.pyplot as plt
x = [1,2,4]
y = [1,3,2]
fig1 = plt.figure(figsize=(5,5),dpi=100)
ax = fig1.add_axes([0,0,1,1])
ax.scatter(x,y)
ax.set_xlim(0,5)
ax.set_ylim(0,5)
transDataToFig1 = ax.transData+fig1.transFigure.inverted()
for ix,iy in zip(x,y):
inDots = ax.transData.transform((ix,iy))
inFigIndirect = fig1.transFigure.inverted().transform(inDots)
inFigDirect = transDataToFig1.transform((ix,iy))
print inDots,"->",inFigIndirect," or ",inFigDirect
fig1.savefig('scatterPos1.png')
由於(1)的軸跨越整個圖中,(2)的軸限制從0設置爲5,以及(3)圖中的尺寸被設定爲5×5和100點每英寸,那麼一個軸單位對應於100個像素。這是通過輸出證實:
[ 100. 100.] -> [ 0.2 0.2] or [ 0.2 0.2]
[ 200. 300.] -> [ 0.4 0.6] or [ 0.4 0.6]
[ 400. 200.] -> [ 0.8 0.4] or [ 0.8 0.4]
上面的代碼還示出了如何從DPI獲得推測單元(BBOX內的值,0和1之間),並提供了一個變換流水線的一個例子(請參閱上面的鏈接)。作爲參考,這是導致圖:
現在,如果你讓有次要情節的進程仍在工作的第二號人物,但像素值不特殊。就拿這個額外的代碼:
fig2=plt.figure(figsize=(5,5),dpi=100)
ax1 = fig2.add_subplot(121)
ax2 = fig2.add_subplot(122)
ax1.scatter(x,y)
ax1.set_xlim(0,5)
ax2.set_ylim(0,5)
ax2.plot(range(10))
transDataToFig2 = ax1.transData+fig2.transFigure.inverted()
for ix,iy in zip(x,y):
inDots = ax1.transData.transform((ix,iy))
inFigIndirect = fig2.transFigure.inverted().transform(inDots)
inFigDirect = transDataToFig2.transform((ix,iy))
print inDots,"->",inFigIndirect," or ",inFigDirect
fig2.savefig('scatterPos2.png')
它導致在此圖中:
而這種輸出:
[ 97.72727273 116.66666667] -> [ 0.19545455 0.23333333] or [ 0.19545455 0.23333333]
[ 132.95454545 383.33333333] -> [ 0.26590909 0.76666667] or [ 0.26590909 0.76666667]
[ 203.40909091 250. ] -> [ 0.40681818 0.5 ] or [ 0.40681818 0.5 ]
注意,在這種情況下,轉型是敏感你使用了哪些軸。我使用軸ax1
,因爲這是散點圖與x
和y
中存儲的點相對應的散點圖。
這些例子與聽起來像你想要做的不同。你有像素的x,y位置,你想看看選擇了哪個點。這只是transData
的反轉變換,它通常(非反轉)以數據單位爲單位,並將它們返回到顯示單位(像素)中的點。每個軸都有自己獨特的transData
,這對軸限制非常敏感。
例如,如果我模擬在位置(120480)鼠標點擊,以像素爲單位,則每個副區將轉換到這一點不同的數據座標,像這樣:
click = (120,480)
print "Click ",click," transforms into:"
print ax1.transData.inverted().transform(click)," for axes 1"
print ax2.transData.inverted().transform(click)," for axes 2"
這導致:
Click (120, 480) transforms into:
[ 1.63225806 3.725 ] for axes 1
[-7.86193548 9.675 ] for axes 2
請注意,ax2
(第二個子圖)的轉換會導致負x位置。這是因爲像素位置(120,480)在第二個子圖的x極限之外。
它似乎你不喜歡接受的答案,如果它不明確:http://meta.stackexchange.com/a/5235/167525 – Yann