2014-12-02 18 views
7

我想以編程方式測試兩個散點圖符號是否會在matplotlib中重疊。因此,考慮一對(X,Y)座標和大小(我的理解是圓的面積,以點爲單位),我想繪製如何將散點大小轉換爲matplotlib中的數據座標?

plt.scatter(x, y, s=s) 

,然後有一個功能叫做points_overlap那如果點會重疊,則返回True,否則返回False

def points_overlap(x, y, s): 
    if ... 
     return True 
    else: 
     return False 

我知道有變換矩陣帶我的不同matplotlib coordinate systems之間,但我想不出寫這個函數的正確步驟。

+0

在黑暗中只是一槍,但似乎有可能背後的「beeswarm」負責人知道這件事。 (http://nbviewer.ipython.org/github/mgymrek/pybeeswarm/blob/master/beeswarm_example.ipynb) – 2014-12-03 17:26:36

+0

據我可以告訴從pybeeswarm代碼,散射點的大小和偏移量是一個參數功能,並需要一些試驗和錯誤,以使事情保持一致。因此,這個問題:) – mwaskom 2014-12-03 17:39:58

+0

黨 - 我希望他們想通了。 – 2014-12-03 17:41:28

回答

2

這需要一些測試,但它可能工作?這些都應該在空間展示

def overlap(x, y, sx, sy): 
    return np.linalg.norm(x - y) < np.linalg.norm(sx + sy) 

測試:

In [227]: X = np.array([[1, 1], [2, 1], [2.5, 1]]) 
In [228]: s = np.array([20, 10000, 10000]) 

In [229]: fig, ax = plt.subplots() 

In [230]: ax.scatter(X[:, 0], X[:, 1], s=s) 
Out[230]: <matplotlib.collections.PathCollection at 0x10c32f28> 

In [231]: plt.draw() 

測試每對:

Xt = ax.transData.transform(X) 
st = np.sqrt(s) 

pairs = product(Xt, Xt) 
sizes = product(st, st) 

for i, ((x, y), (sx, sy)) in enumerate(zip(pairs, sizes)): 
    h = i % 3 
    j = i // 3 
    if h != j and overlap(x, y, sx, sy): 
     print((i, h, j)) 

enter image description here

有很多改進的餘地。將所有數據轉換爲points_overlap函數可能會更容易,而不是在裏面進行轉換。實際上這會更好。

+0

這似乎很接近,但並不完全。請參閱[本](http://nbviewer.ipython.org/gist/mwaskom/000cb7d78e8ea6ac286b)筆記本進行更多測試。 – mwaskom 2014-12-03 05:39:39

相關問題