2017-02-05 3 views
1

Ich möchte eine Legende in meinem Streudiagramm darstellen. Mein aktueller Code sieht wie folgt ausmatplotlib Streudiagramm mit Legende

x=[1,2,3,4] 
y=[5,6,7,8] 
classes = [2,4,4,2] 
plt.scatter(x, y, c=classes, label=classes) 
plt.legend() 

Das Problem ist, dass, wenn das Grundstück erstellt wird, wird die Legende als Array gezeigt, anstatt die eindeutigen Markierungen zeigen und ihre Klassen.

This is how the plot looks

ich weiß ist dies eine Frage zuvor in Themen diskutiert, wie diese one, aber ich fühle, dass mein Problem ist noch einfacher und die Lösung es nicht passt es nicht. Auch in diesem Beispiel gibt die Person die Farben an, aber in meinem Fall weiß ich vorher, wie viele Farben ich brauche. Darüber hinaus erstellt der Benutzer in this Beispiel mehrere Scatter, jede mit einer eindeutigen Farbe. Auch das ist nicht das, was ich will. Mein Ziel ist es, das Plot einfach mit einem x, y Array und den Labels zu erstellen. Ist das möglich?

Danke.

Antwort

4

Tatsächlich bieten beide verknüpfte Fragen eine Möglichkeit, das gewünschte Ergebnis zu erzielen.

Die einfachste Methode besteht darin, so viele Streudiagramme zu erstellen, wie eindeutige Klassen existieren, und jedem einen einzelnen Farb- und Legendeneintrag zu geben.

import matplotlib.pyplot as plt 

x=[1,2,3,4] 
y=[5,6,7,8] 
classes = [2,4,4,2] 
unique = list(set(classes)) 
colors = [plt.cm.jet(float(i)/max(unique)) for i in unique] 
for i, u in enumerate(unique): 
    xi = [x[j] for j in range(len(x)) if classes[j] == u] 
    yi = [y[j] for j in range(len(x)) if classes[j] == u] 
    plt.scatter(xi, yi, c=colors[i], label=str(u)) 
plt.legend() 

plt.show() 

enter image description here

+0

Ihre Antwort hat mir geholfen, die Plots zu erstellen ich wollte. Vielen Dank. – user3276768

+1

Bin ich der Einzige, der es überraschend findet, dass es dafür keine Möglichkeit gibt? Ich habe das Gefühl, die Verteilung von Punkten verschiedener Klassen zu planen ist eine sehr übliche Aufgabe. Bitte erleuchte mich, wenn du weißt warum. – Johannes

+0

@Johannes Was genau möchten Sie "eingebaut" haben? Geht es um die Handlung oder die Legende? – ImportanceOfBeingErnest

3

Füllung Vielleicht manuell ein table hier nützlich sein könnte. Eine andere Idee verwendet colorbar, wenn Ihre Klassen zusammenhängende Nummern sind. Ich zeige beide Ansätze in einem.

x=[1,2,3,4,5,6,7] 
y=[1,2,3,4,5,6,7] 
classes = [2,4,4,2,1,3,5] 
cmap = cm.get_cmap("viridis",5) 
plt.scatter(x, y, c=classes, label=classes,cmap=cmap,vmin=0.5,vmax=5.5) 
plt.colorbar() 
unique_classes = list(set(classes)) 
plt.table(cellText=[[x] for x in unique_classes], loc='lower right', 
      colWidths=[0.2],rowColours=cmap(np.array(unique_classes)-1), 
     rowLabels=['label%d'%x for x in unique_classes], 
      colLabels=['classes']) 

enter image description here

+1

Gute Idee! Nur das Colormapping ist ein bisschen hacky. – ImportanceOfBeingErnest

+1

Ja, es muss angepasst werden und wird nur angewendet, wenn Ihre Daten alle Nummern im Intervall enthalten. –

Verwandte Themen