2011-02-15 75 views
10

我試圖以編程方式在pylab中顯示各種類型的圖。 pylab的分散函數在其座標軸的不同座標中顯示標記,但標記大小是以像素爲單位的。這對於日常圖形情節是有意義的。但是,我想在同一座標中給出座標和標記大小!例如下面的代碼在(0.0,0.0)和(0.5,0.5)處顯示兩個大小爲20的圓圈。這些應該幾乎完全重疊,因爲半徑比中心之間的距離大得多。但是,它們並不是因爲尺寸是以像素爲單位,而位置是以軸座標表示的。在同一座標中繪製/分散位置和標記大小

import pylab 
pylab.scatter([0,0.5], [0,0.5], s=20, c='b', marker='o') 

有沒有辦法做一個散點圖(或繪製的任何形狀,線條等)在同一座標給出的大小和位置?我感興趣的是矢量圖形輸出(pdf,svg等)。

回答

13

pylab.scatter函數根據點數^ 2中的大小獲取值大小。這個大小將獨立於座標軸,散點圖的本質也是如此(如果您在散點圖中的某個區域上縮小點數,則大小無關緊要)。

如果你想說畫圈圈是一個給定的尺寸,你應該在pylab

import pylab 
axes = pylab.axes() 
circle1 = pylab.Circle((0,0), radius=20, alpha=.5) 
circle2 = pylab.Circle((0.5,0.5), radius=20, alpha=.5) 
axes.add_patch(circle1) 
axes.add_patch(circle2) 
pylab.axis('scaled') 
pylab.show() 

使用循環命令。如果您需要與散點圖類似能力的東西,你可以不喜歡

import pylab 
import matplotlib 

def my_circle_scatter(axes, x_array, y_array, radius=0.5, **kwargs): 
    for x, y in zip(x_array, y_array): 
     circle = pylab.Circle((x,y), radius=radius, **kwargs) 
     axes.add_patch(circle) 
    return True 

def my_square_scatter(axes, x_array, y_array, size=0.5, **kwargs): 
    size = float(size) 
    for x, y in zip(x_array, y_array): 
     square = pylab.Rectangle((x-size/2,y-size/2), size, size, **kwargs) 
     axes.add_patch(square) 
    return True 

def my_polygon_scatter(axes, x_array, y_array, resolution=5, radius=0.5, **kwargs): 
    ''' resolution is number of sides of polygon ''' 
    for x, y in zip(x_array, y_array): 
     polygon = matplotlib.patches.CirclePolygon((x,y), radius=radius, resolution=resolution, **kwargs) 
     axes.add_patch(polygon) 
    return True 

axes=pylab.axes() 
my_circle_scatter(axes, [0,0.5], [0,0.5], radius=2, alpha=.5, color='b') 
my_square_scatter(axes, [-3,-4,2,3], [1,-3,0,3], size=.5, alpha=.5, color='r') 
my_polygon_scatter(axes, [-1,-2,3], [-3,0,3], radius=.5, resolution=3, alpha=.5, color='g') 
my_polygon_scatter(axes, [4,1.5,3], [2,-1,-3], radius=.5, resolution=5, alpha=.5, color='k') 
pylab.axis('scaled') 
pylab.axis([-5,5,-5,5]) 
pylab.show() 

請參閱http://matplotlib.sourceforge.net/api/artist_api.html#module-matplotlib.patches其他可繪製對象。從第一個片段

輸出樣本: matplotlib scatter plot

編輯格里夫:從第二片段輸出 matplotlib circles

樣品如果你要處理的每個點不同的半徑,你可以做一些簡單的像:

def my_circle_scatter_radii(axes, x_array, y_array, radii_array, **kwargs): 
    for (x, y, r) in zip(x_array, y_array, radii_array): 
     circle = pylab.Circle((x,y), radius=r, **kwargs) 
     axes.add_patch(circle) 
    return True 

同時處理兩種情況下的邏輯也是簡單的(例如,檢查是否它的一個radii_array是int/float,如果是這樣,使其成爲一個數組)。

+0

你如何與不同半徑的每個點的數組做到這一點?它不接受'radius ='參數中的數組。 – Griff 2013-03-05 14:57:07

2

修補程序集是一個更好的選擇,如果你真的想使它類似於plt.scatter。假設你想繪製一個以數據爲單位的給定半徑的圓的散點圖,你可以看看this post,它提供了一個名爲circles的良好包裝函數。

如果您想要使用其他標記如正方形或多邊形,您可以用jimbob的回答中所述的相應補丁重寫此函數。

下面是一個例子

from pylab import * 
figure(figsize=(6,4)) 
ax = subplot(aspect='equal') 

#plot a set of circle 
a = arange(11) 
circles(a, a, s=a*0.2, c=a, alpha=0.5, ec='none') 
colorbar() 

#plot a circle (the lower-right one) 
circles(1, 0, s=0.4, c='r', ls='--', lw=5, fc='none', transform=ax.transAxes) 

xlim(0,10) 
ylim(0,10) 

enter image description here