2017-05-14 1 views
2

pyplot.scatter ermöglicht die Übergabe an c= ein Array, das Gruppen entspricht, die dann die Punkte basierend auf diesen Gruppen färben wird. Dies scheint jedoch das Erzeugen einer Legende nicht zu unterstützen, ohne jede Gruppe separat einzeln zu zeichnen.Streudiagramm mit Legende farbig nach Gruppe ohne mehrere Aufrufe von plt.scatter

So zum Beispiel farbigen ein Streudiagramm mit Gruppen durch Iterieren über die Gruppen und Plotten jeweils separat erzeugt werden:

import matplotlib.pyplot as plt 
from sklearn.datasets import load_iris 
feats = load_iris()['data'] 
target = load_iris()['target'] 

f, ax = plt.subplots(1) 
for i in np.unique(target): 
    mask = target == i 
    plt.scatter(feats[mask, 0], feats[mask, 1], label=i) 
ax.legend() 

Welche erzeugt:

enter image description here

ich erreichen kann, ein ähnlich aussehendes Diagramm, ohne jedoch über jede Gruppe zu iterieren:

f, ax = plt.subplots(1) 
ax.scatter(feats[:, 0], feats[:, 1], c=np.array(['C0', 'C1', 'C2'])[target]) 

Aber ich kann keinen Weg finden, eine entsprechende Legende mit dieser zweiten Strategie zu erzeugen. Alle Beispiele, auf die ich gestoßen bin, durchlaufen die Gruppen, was ... weniger als ideal erscheint. Ich weiß, dass ich eine Legende manuell erzeugen kann, aber das scheint wieder übermäßig umständlich.

Antwort

0

Das matplotlib Streu Beispiel, das dieses Problem behebt auch eine Schleife verwendet, so dass wahrscheinlich die beabsichtigte Verwendung ist: https://matplotlib.org/examples/lines_bars_and_markers/scatter_with_legend.html

Wenn Ihr größeres Ziel Plotten einfach zu machen und Kennzeichnung kategorische Daten einfacher, sollten Sie Seaborn betrachten . Dies ist eine ähnliche Frage zu Scatter plots in Pandas/Pyplot: How to plot by category

Eine Möglichkeit, Ihr Ziel zu erreichen, ist die Verwendung von Pandas mit beschrifteten Spalten. Sobald Sie Daten in einem Pandas Dataframe haben, können Sie Seaborn pairplot verwenden, um diese Art von Plot zu erstellen. (Seaborn hat auch die Iris-Datensatz zur Verfügung als markierter Datenrahmen)

import seaborn as sns 
iris = sns.load_dataset("iris") 
sns.pairplot(iris, hue="species") 

enter image description here

Wenn Sie nur die ersten beiden Funktionen nutzen möchten, können Sie

sns.pairplot(x_vars=['sepal_length'], y_vars=['sepal_width'], data=iris, hue="species", size=5) 

enter image description here

Wenn Sie möchten das sklearn Datendiktat wirklich verwenden, Sie können das in einen Datenrahmen wie folgt ziehen:

import pandas as pd 
from sklearn.datasets import load_iris 
import numpy as np 

feats = load_iris()['data'].astype('O') 
target = load_iris()['target'] 
feat_names = load_iris()['feature_names'] 
target_names = load_iris()['target_names'].astype('O') 

sk_df = pd.DataFrame(
    np.hstack([feats,target_names[target][:,np.newaxis]]), 
    columns=feat_names+['target',]) 
sns.pairplot(sk_df, vars=feat_names, hue="target") 
+0

Ich bin mir bewusst, dass Sie dies in Seaborn einfach tun können, aber mein tatsächlicher Anwendungsfall (wo ich 3D-Punktdiagramme plotten) Seaborn wird nicht unterstützt. unter der Motorhaube benutzt Seaborn Matplotlib, um das Plotten durchzuführen - ich nehme an, ich könnte durchgehen und sehen, wie Seaborn die Streudiagramme und die zugehörigen Figurenlegenden im Paarplot (oder Regplot) generiert. Meine Vermutung ist, dass es sich wie in meinem ersten Beispielcode um die Gruppen dreht. – user3014097

Verwandte Themen