2016-09-29 2 views
1

Ausgearbeitt Frage:lesen und liefert alle Werte aus einem Array

Lassen Sie mich meine Frage klären. Ich mag entlang der Y-Achse und Modalität Werte entlang der X-Achse mit Subjektivität Polarität eine Liste der Feldausgabe als 2D-Streudiagramm zeichnen, die zwischen -1 und 1 liegen bestimmt die Art der Markierung (o, x, ^, v)

Ausgang

polarities: [ 0. 0. 0. 0.] 
subjectivity: [ 0.1 0. 0. 0. ] 
modalities: [ 1. -0.25 1. 1. ] 

Der modifizierte Code mit begrenztem Markierungswert für 2 Bereich.

print "polarities: ", a[:,0] 
print "subjectivity: ", a[:,1] 
print "modalities: ", a[:,2] 

def markers(r): 
    markers = np.array(r, dtype=np.object) 
    markers[(r>=0)] = 'o' 
    markers[r<0] = 'x' 
    return markers.tolist() 

def colors(s): 
    colors = np.array(s, dtype=np.object) 
    colors[(s>=0)] = 'g' 
    colors[s<0] = 'r' 
    return colors.tolist() 

fig=plt.figure() 
ax=fig.add_subplot(111) 
ax.scatter(a[:,0], a[:,1], marker = markers(a[:,2]), color= colors(a[:,0]), s=100, picker=5) 

Meine Absicht ist es, den Modalitätswert zu überprüfen und einen der vier Marker zurückzugeben. Wenn ich Hardcore 'o' es die Handlung zurückgibt.

ax.scatter(a[:,0], a[:,1], marker = markers('o'), color= colors(a[:,0]), s=100, picker=5) 

Als Versuch habe ich versucht, die Farbfunktion zu imitieren und als pass [: 2], aber traf eine Shell-Ausgabe Fehler

ValueError: Unrecognized marker style ['o', 'x', 'o', 'o'] 

Die Frage ist: Ist mein Ansatz falsch? oder wie man den Markierungsstil erkennt?

Edit1

Der Versuch, den m-Wert zu erhalten, zwischen 0 und 0,5

mit diesem Code

ax.scatter (p[0<m<=.5], s[0<m<=.5], marker = "v", color= colors(a[:,0]), s=100, picker=5) 

diesen Fehler

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

ergibt Wie m Reichweite Wert zwischen 0 und 0,5 im Beispiel in Antwort gegeben er 2.

Antwort

1

Es ist aus Ihrer Frage nicht klar, aber ich nehme an, Ihr Array a der Form ist (N,3) und so Ihre Arrays s und r sind tatsächlich Arrays und nicht Skalare.

First off, können Sie nicht haben mehrere Marker mit einem Aufruf von scatter(). Wenn Sie möchten, dass Ihr Plot mehrere Marker hat, müssen Sie Ihr Array korrekt zerschneiden und mehrere scatter() für jeden Ihrer Marker machen.

In Bezug auf die Farben ist Ihr Problem, dass Ihre Funktion colors(r) nur eine Farbe zurückgibt, wo es ein Array von Farben (mit der gleichen Anzahl von Elementen wie a[:,0]) zurückgeben sollte. Wie so:

def colors(s): 
    colors = np.array(s, dtype=np.object) 
    colors[(s>0.25)&(s<0.75)] = 'g' 
    colors[s>=0.75] = 'b' 
    colors[s<=0.25] = 'r' 
    return colors.tolist() 

a = np.random.random((100,)) 
b = np.random.random((100,)) 

plt.scatter(a,b,color=colors(b)) 

ANTWORT AUF IHRE EDIT 1:

Sie scheinen auf dem richtigen Weg zu sein, musst du so viele scatter() Anrufe tun, wie Sie Marker haben.

Ihr Fehler kommt aus dem Aufschneiden Index [0<m<=.5], die Sie nicht so verwenden können.Sie müssen die vollständige Notation verwenden [(m>0.)&(m<=.5)]

+0

Danke. Bitte beachten Sie die ausführliche Frage. –

+0

@Programmer_nltk Ich habe Ihr EDIT 1-Problem beantwortet. Ich glaube, Sie haben alles, was Sie brauchen, um Ihr Problem von hier zu lösen –

+0

Danke. Tatsächlich! Es ist fertig. –

1

Wie Diziet wies darauf hin, plt.scatter() kann nicht mit mehreren Markern umgehen. Sie müssen daher ein Streudiagramm pro Markerkategorie erstellen. Dies kann meine Konditionierung auf dem Grundstück erfolgen, die von der Markierung reflektiert werden soll. In diesem Fall:

import numpy as np 
import matplotlib.pyplot as plt 

p = np.array([ 0. , 0.2 , -0.3 , 0.2]) 
s = np.array([ 0.1, 0., 0., 0.3 ]) 
m = np.array([ 1., -0.25, 1. , -0.6 ]) 


colors = np.array([(0.8*(1-x), 0.7*x, 0) for x in np.ceil(p)]) 

fig=plt.figure() 
ax=fig.add_subplot(111) 

ax.scatter(p[m>=0], s[m>=0], marker = "o", color= colors[m>=0], s=100) 
ax.scatter(p[m<0], s[m<0], marker = "s", color= colors[m<0], s=100) 

ax.set_xlabel("polarity") 
ax.set_ylabel("subjectivity") 

plt.show() 
+0

Danke. Bitte sehen Sie edit 1. –

+0

Es wäre hilfreich, wenn Sie nicht nur eine Frage nach der anderen stellen würden, sondern eine Lösung suchen würden, die auf dem basiert, was Sie bereits wissen. In diesem Fall wurde die Antwort darauf, wie Sie Indizes basierend auf mehreren Bedingungen auswählen, bereits in Diziets Antwort gegeben. – ImportanceOfBeingErnest

+0

Wirklich zu schätzen den Kommentar. Problem ist, dass ich Matplotlib sehr neu bin, also experimentiere auf die Eingabe von anderen durch Versuch und Irrtum. Ich werde versuchen, die Lösung zu finden. Vielen Dank. –

Verwandte Themen