2017-04-01 4 views
0

Ich habe ein Diagramm auf Matplotlib gezeichnet und versuche, eine Legende zu erstellen. Wie erhalte ich matplotlib, um eine eigene Legende mit den Farbmarkierungen zu erstellen, mit denen ich meine Datentypen differenziert habe?Wie lege ich eine Legende auf Matplotlib?

Meine Daten werden aus einer CSV-Datei gelesen, die die Beschriftungen für jeden Formtyp enthält.

My graph

Mein Code sieht wie folgt aus:

data_df = pd.DataFrame.from_csv("AllMixedShapes2.csv") 
    X1 = np.array(data_df[features2].values) 
    y1 = np.array(data_df[features3].values) 

    plt.scatter(X1[:, 0],y1, c=y, cmap=plt.cm.Paired) 
    plt.axis([0, 17, 0, 200]) 
    plt.ylabel("Maximum Angle (Degrees)") 
    plt.xlabel("Number Of Sides") 
    plt.title('Original 450 Test Shapes') 

    plt.legend() 
    plt.show() 

Ich habe versucht, dies:

handles, labels = ax.get_legend_handles_labels() 
ax.legend(handles, labels) 

Aber ich erhalte immer diese Fehlermeldung:

handles, labels = ax.get_legend_handles_labels() 
UnboundLocalError: local variable 'ax' referenced before assignment 

EDIT:

Ich versuchte dies:

features_of_labels = ["Circle", "Equilateral Triangle", "Right Angle Triangle", 
        "Obtuse Triangle", "Acute Triangle", "Square", "Rectangle", 
        "Parallelogram", "Seal"] 

data_df = pd.DataFrame.from_csv("AllMixedShapes2.csv") 
X1 = np.array(data_df[features2].values) 
y1 = np.array(data_df[features3].values) 
l = np.array(data_df[features_of_labels].values) 

aber ich bekomme die folgende Fehlermeldung: KeyError: „[ 'Circle' 'Equilateral Dreieck' 'Right Angle Triangle' 'stumpfes Dreieck' \ n ' Akutes Dreieck‘‚Square‘‚Rechteck‘‚Parallelogramm‘‚Seal‘] nicht in dem Index“

jedoch, wenn ich ändere features_of_labels-header und header = ["Label"] es funktioniert, aber druckt wie im nächsten Bild gezeigt jedes Etikett aus. Hier

enter image description here

+0

Try 'ax = plt.gca()' vor dieser Zeile. – bernie

+0

@bernie Ich erhalte diesen Fehler: 'UserWarning: Keine beschrifteten Objekte gefunden. Verwenden Sie label = '...' kwarg auf einzelnen Plots. –

+1

Also haben Sie getan, was die Warnung Ihnen gesagt hat? Sie sollten sich auch [Frage 1] (http://stackoverflow.com/questions/37812325/pandas-scatter-plot-with-different-color-legend-for-each-point), [Frage 2] (http://stackoverflow.com/questions/30505407/create-legend-for-scatter-plot-using-the-label-of-the-samples-in-matplotlib) und [Frage 3] (http: // stackoverflow com/questions/8017654/how-to-add-legende-for-scatter) und das erworbene Wissen nutzen, um Ihre Frage zu verbessern. Was wollen Sie erreichen und inwiefern helfen Ihnen diese Techniken nicht? – ImportanceOfBeingErnest

Antwort

0

ist ein Beispiel:

import matplotlib.patches as mpatches 
import matplotlib.pyplot as plt 


# data for example 
y1 = [i for i in range(10)] 
y2 = [i for i in range(10)] 
colors = ['m','b','g','m','b','g','m','b','g','g'] 
lables = ['m','b','g','m','b','g','m','b','g','g'] 

plt.scatter(y1, y2,c=colors, cmap=plt.cm.Paired) 

# Match colors and labels,remove duplicates 
colors_lables = zip(colors, lables) 
colors_lables = list(set(colors_lables)) 
lables = [lable for color,lable in colors_lables] 

# create some patchs of colors 
lables_patchs = [] 
for item in c_l: 
    add_patch = mpatches.Patch(color=item[0], label=item[1]) 
    lables_patchs.append(add_patch) 

plt.legend(lables_patchs, lables) 

plt.show() 

Und das Bild, das wir erhalten: enter image description here

Sie können Ihre Farben und lables, Duplikate entfernen, passen und einige patchs von Farben schaffen für deine Legende.

Weiter mehr, können Sie einige Punkte von Farben für Ihre Legende machen

lables_patchs = [] 
for item in c_l: 
    # here, use scatter() 
    add_patch = plt.scatter([],[],color=item[0], label=item[1]) 
    lables_patchs.append(add_patch) 

Und Sie erhalten: enter image description here

+0

Ich zeigte meinen Versuch in der Bearbeitung der Frage. Weißt du, was ich falsch mache? –

+0

Ich reparierte die Antwort, und es gibt ein Beispiel für dich. Hoffnung, die hilft. – xiaoyi