2011-12-13 261 views
2

我有一個Matplotlib散點圖,繪製3個不同的圓,我試圖找到這些圓中每一個圓的中心點的軸x,y座標,即bbox 0和1.我正在嘗試這樣做,因爲我將圖像保存爲.png文件,並希望在.png文件的(512,1024)空間中找到相應的x,y點。Matplotlib:散點圖的圓心

我曾嘗試使用下面的代碼,但我不知道如何解釋的頂點和碼本打印:

ax = fig.gca() 
for collection in ax.collections: 
    for path in collection._paths: 
     for p in path.iter_segments(): 
      print p 

它打印10個陣列的三個圓,但這個是沒有意義的我因爲只有三個圈,我似乎無法找到可以解釋這個任何文件:

(陣列([0,-0.5]),1)

(陣列([0.13260155, -0.5,0.25978994,-0.44731685,0.35355339, -0.35355339 ]),4)

(陣列([0.44731685,-0.25978994,0.5%,-0.13260155,0.5,0.1]),4)

(陣列([0.5,0.13260155,0.44731685,0.25978994,0.35355339, 0.35355339]),4)

(陣列([0.25978994,0.44731685,0.13260155,0.5,0.1,0.5 ]),4)

(陣列([ - 0.13260155,0.5%,-0.25978994,0.44731685 ,-0.35355339, 0.35355339]),4)

(陣列([ - 0.44731685,0.25978994,-0.5,0.13260155,-0.5,0]),4)

(陣列([ - 0.5,-0.13260155,-0.44731685,-0.25978994,-0.35355339, - 0.35355339]),4)

(陣列([ - 0.25978994,-0.44731685,-0.13260155,-0.5,0.1,-0.5 ]),4)

(陣列([0,-0.5 ]),79)

謝謝

+0

它似乎你不喜歡接受的答案,如果它不明確:http://meta.stackexchange.com/a/5235/167525 – Yann

回答

3

我想你可能會對感興趣轉型。使用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之間),並提供了一個變換流水線的一個例子(請參閱上面的鏈接)。作爲參考,這是導致圖:

enter image description here

現在,如果你讓有次要情節的進程仍在工作的第二號人物,但像素值不特殊。就拿這個額外的代碼:

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') 

它導致在此圖中:

enter image description here

而這種輸出:

[ 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,因爲這是散點圖與xy中存儲的點相對應的散點圖。

這些例子與聽起來像你想要做的不同。你有像素的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極限之外。

+0

這正是我正在尋找...謝謝! – hotshotiguana

+0

當我只有一個子圖時,這很好用,當我處理多個子圖時,我應該做些什麼?我在比較inFigIndirect和inFigDirect時得到的數字非常不同,所以我不知道如何繼續。任何幫助將不勝感激。謝謝! – hotshotiguana

+0

@hotshotiguana這是因爲我對transDataToFig變換的定義存在問題。它是以錯誤的順序定義的,所以'inFigDirect'沒有正確計算。它發生在上面這個特殊的例子中表現很好,但是當我去做一個不太強迫的例子時,它是對的。我又增加了一個例子和討論。請讓我知道這是否有幫助。 – Yann