2017-01-26 2 views
1

Ich kann nicht sehen (oder herauszufinden), wie die Legende mit pyplot.scatter() angezeigt wird, wenn ich die Beschriftungen zu numerischen Werten geändert habe.Wie zeichnet man die Legende mit pyplot.scatter(), wenn die Legende nur Zahlenwerte sind?

Das heißt, ich meine kategorischen Werte 'a' umgewandelt, 'b', 'c', .. in 0, 1, 2, ...

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter

ist hier das Beispiel gegeben oben auf der URL:

import numpy as np 
import matplotlib.pyplot as plt 

N = 50 
x = np.random.rand(N) 
y = np.random.rand(N) 
colors = np.random.rand(N) 
area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radii 

plt.scatter(x, y, s=area, c=colors, alpha=0.5, cmap=cm.jet) 
plt.show() 

die enter image description here

Normalerweise gibt, glaube ich, ein etwas tun würde:

Dies gibt keine Legende aus, die jeder Farbe im Diagramm mit der Nummer im Array entspricht.

/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/matplotlib/axes/_axes.py:518: UserWarning: The handle <matplotlib.collections.PathCollection object at 0x1167d03c8> has a label of '_collection0' which cannot be automatically added to the legend. 
    'legend.'.format(handle, label)) 

Wie kann ich eine Legende ausgeben, die zeigt, welche Nummer dem Array-Wert entspricht?

+0

Das ist ziemlich unklar. Möchten Sie eine Legende mit 'N = 50' Einträgen haben? Das passt nicht mal auf die Seite. – ImportanceOfBeingErnest

+0

Ich weiß, was Sie fragen. Wenn ich zu meinem Computer komme, poste ich die Lösung. –

+0

@ O.rka Danke – ShanZhengYang

Antwort

1

Dies ist, was ich persönlich für alle meine Matplotlib Legenden verwende. Normalerweise speichere ich meine Daten in dictionaries und pd.Series Objekte.

def get_legend_markers(D_label_color, marker="o", marker_kws={"linestyle":""}): 
    """ 
    Usage: plt.legend(*legend_vars(D_taxon_color), 
         loc="lower center", 
         bbox_to_anchor=(0.5,-0.15), 
         fancybox=True, shadow=True, 
         prop={'size':15}) 

    Input: Dictionary object of {label:color} 
    Output: Tuple of markers and labels 
    """ 
    markers = [plt.Line2D([0,0],[0,0],color=color, marker=marker, **marker_kws) for color in D_label_color.values()] 
    return (markers, D_label_color.keys()) 

So könnte man so etwas wie:

D_label_color = {"A":"green", "B":"blue", "C":"red"} 
fig, ax = plt.subplots() 
x = np.linspace(0, 2*np.pi) 
y = np.sin(x) 
c = ["green"]*20 + ["blue"]*20 + ["red"]*10 
ax.scatter(x=x, y=y, c=c) 
ax.legend(*get_legend_markers(D_label_color) 

Wenn Sie nicht genau wissen, welche Farbe zugeordnet ist, zu welchem ​​Punkt Sie können sie mit seaborn zuweisen für jede Kategorie mit sns.color_palette(n_colors) und dann eine Liste machen/Vektor der Farben (wie c oben) und geben Sie dann ax.scatter diese Farbzuordnung. Hoffe das hilft. Wenn Sie mit kontinuierlichen Daten zu tun haben, würde ich mit einem Farbbalken wie @suever oben erwähnt gehen. Sie können keine Legende mit kontinuierlichen Daten haben.

2

Ein legend funktioniert nicht für Ihr Streudiagramm, da das Streudiagramm ein einzelnes Objekt erstellt und nur als einzelnes Objekt in einem legend angezeigt wird. Da die Farbe von jedem Punkt auf der colormap der Achsen abhängt, müssen Sie stattdessen eine colorbar

plt.colorbar(example) 

verwenden Wenn Sie eine legend stattdessen wollen, müssen Sie für jede Gruppe eine separate Streudiagramm erstellen und dann Erstellen Sie eine Legende von , dass. Ein Beispiel dafür ist here

Verwandte Themen