2014-12-02 21 views
7

Matplotlib'de iki scatterplot glifinin örtüşüp örtüşmeyeceğini programlı olarak test etmek isterim. Bu yüzden, bir çift verilen (x, y) koordinatları (i noktalarında, dairenin alanı olduğunu anlamak gibi) bir boyut, birMatplotlib'deki dağılım boyutundan veri koordinatlarına nasıl dönüştürebilirim?

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

çizmek ve daha sonra bir fonksiyonu points_overlap olarak belirlenmesidir istiyorum Bu parametreleri alır ve eğer puanlar çakışırsa ve False aksi takdirde True değerini döndürür.

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

farklı matplotlib coordinate systems arasında beni almaya transformasyon matrisleri vardır biliyorum, ama bu fonksiyonu yazmak için doğru adımları çözemiyorum.

+0

karanlıkta sadece bir atış, ama 'beeswarm' arkasındaki sorumlu tarafların bu konuda bir iki şey biliyor olabilir gibi görünüyor. (http://nbviewer.ipython.org/github/mgymrek/pybeeswarm/blob/master/beeswarm_example.ipynb) –

+0

Pybeeswarm kodundan anlayabildiğim kadarıyla, scatter noktalarının boyutu ve ofseti İşler ve işleri hizalamak için bazı deneme-yanılma gerektirir. Bu yüzden bu soru :) – mwaskom

+0

Dang - Anladım diye umuyordum. –

cevap

2

Bu, bazı sınava gerek duyar, ancak işe yarayabilir? Bunların hepsi Görüntü uzayda olmalıdır

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

testi:

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

Testi her çifti: iyileştirilmesi için oda

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

var çok. Verilerinizi dönüştürmek yerine tüm verilerinizi dönüştürmek ve bunu points_overlap işlevine aktarmak daha kolay olabilir. Aslında bu daha iyi olurdu.

+0

Bu yakın görünüyor ama tam olarak değil. Daha fazla test için [this] (http://nbviewer.ipython.org/gist/mwaskom/000cb7d78e8ea6ac286b) not defterine bakın. – mwaskom

İlgili konular