2017-08-23 3 views
2

Ich habe ein sehr spezifisches Problem. Ich habe zwei numply Arrays und das entsprechende Element jedes Arrays repräsentieren einen 2d-Punkt.Streudiagramm Markergröße Berechnung

Ich möchte ein Streudiagramm darstellen, bei dem die Größe des Markers davon abhängt, wie oft der Punkt auftritt.

Das heißt:

1,5 : 2 

2,0 : 1 

1,3 : 1 

6,1 : 1 

So ist die Größe Array size = sein muss [2,1,1,1] und die beiden anderen Arrays können

a = [1,2,1,6] und b = [5,0,3,1]

Also ich muss plt.scatter wie folgt anrufen können:

plt.scatter(a,b,s=size) 

Antwort

2

Da die Frage mit numpy markiert ist, können wir numpy verwenden. numpy.unique ermöglicht die Berechnung der Anzahl eindeutiger Werte eines Arrays.

import numpy as np 

a = [1,2,1,6,1] 
b = [5,0,3,1,5] 

u, c = np.unique(np.c_[a,b], return_counts=True, axis=0) 

dann

# u= 
[[1 3] 
[1 5] 
[2 0] 
[6 1]] 
# c= 
[1 2 1 1] 

Dies kann wie so aufgetragen werden, wo eine zusätzliche Funktion verwendet werden kann, zum Plotten

import matplotlib.pyplot as plt 
s = lambda x : (((x-x.min())/float(x.max()-x.min())+1)*8)**2 

plt.scatter(u[:,0],u[:,1],s=s(c)) 

plt.show() 

enter image description here

+0

die Zählungen zu einigen Punktgrößen zu normalisieren Das hat mein Problem gelöst. Aber eine Sache ist der Parameter "Achse" funktioniert nicht, wenn ich es in Python 2.7 versuche. Warum ist das so? –

+0

Ich benutze Python 2.7 selbst, also hat das nichts mit der Python-Version zu tun, sondern mit der Version von numpy, die Sie verwenden. Das 'axis' Argument wurde in der numpy Version 1.13.0 hinzugefügt. – ImportanceOfBeingErnest

1

Th ist das tun, was Sie wollen:

from collections import Counter 

a = [1, 2, 1, 6, 1] 
b = [5, 0, 3, 1, 5] 

counts = Counter([(x, y) for x, y in zip(a, b)]) 

size = [counts[(x, y)] for x, y in zip(a, b)] 

counter verfolgen, wird wie in Ihre Arrays jeder Punkt erscheint viele Male. Dann bekommt die Größe diese Nummer von counter.

Beachten Sie, dass Sie eigentlich size = [2, 1, 1, 1, 2] möchten, weil Sie s benötigen, um die gleiche Größe wie Ihre Eingabe-Arrays zu haben. Dies wird jedoch nicht wichtig sein; Sie werden den gleichen Punkt nur zweimal zeichnen.

Wenn Sie wirklich die Duplikate entfernen möchten, können Sie dasselbe tun, aber fügen Sie einen zusätzlichen Schritt hinzu, wo Sie eine set Punkte erstellen.

from collections import Counter 

a = [1, 2, 1, 6, 1] 
b = [5, 0, 3, 1, 5] 

counts = Counter([(x, y) for x, y in zip(a, b)]) 

points = set([(x, y) for x, y in zip(a, b)]) 
a = list() 
b = list() 
for x, y in points: 
    a.append(x) 
    b.append(y) 

size = [counts[(x, y)] for x, y in zip(a, b)]