Ich versuche, mit einem Pandas DataFrame-Objekt ein einfaches Streudiagramm in Pyplot zu erstellen, möchte aber eine effiziente Methode zum Zeichnen von zwei Variablen, wobei die Symbole durch eine dritte Spalte (Schlüssel) vorgegeben werden. Ich habe verschiedene Möglichkeiten mit df.groupby ausprobiert, aber nicht erfolgreich. Ein Beispiel für ein df-Skript finden Sie unten. Dies färbt die Markierungen gemäß 'key1', aber ich würde gerne eine Legende mit 'key1'-Kategorien sehen. Bin ich nah dran Vielen Dank.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.normal(10,1,30).reshape(10,3), index = pd.date_range('2010-01-01', freq = 'M', periods = 10), columns = ('one', 'two', 'three'))
df['key1'] = (4,4,4,6,6,6,8,8,8,8)
fig1 = plt.figure(1)
ax1 = fig1.add_subplot(111)
ax1.scatter(df['one'], df['two'], marker = 'o', c = df['key1'], alpha = 0.8)
plt.show()
quelle
ax.legend(numpoints=1)
, um nur einen Marker anzuzeigen . Es gibt zwei, wie bei aLine2D
, es gibt oft eine Linie, die die beiden Markierungen verbindet.plt.hold(True)
nach demax.plot()
Befehl hinzugefügt wurde . Irgendeine Idee warum?set_color_cycle()
wurde in matplotlib 1.5 veraltet. Das gibt esset_prop_cycle()
jetzt.Dies ist einfach mit Seaborn (
pip install seaborn
) als Oneliner zu tunsns.pairplot(x_vars=["one"], y_vars=["two"], data=df, hue="key1", size=5)
::Hier ist der Datenrahmen als Referenz:
Da Ihre Daten drei variable Spalten enthalten, möchten Sie möglicherweise alle paarweisen Dimensionen mit folgenden Elementen zeichnen:
https://rasbt.github.io/mlxtend/user_guide/plotting/category_scatter/ ist eine weitere Option.
quelle
Mit
plt.scatter
kann ich mir nur eines vorstellen: einen Proxy-Künstler verwenden:Und das Ergebnis ist:
quelle
Sie können df.plot.scatter verwenden und ein Array an das Argument c = übergeben, das die Farbe jedes Punkts definiert:
quelle
Sie können auch Altair oder ggpot ausprobieren, die sich auf deklarative Visualisierungen konzentrieren.
Altair-Code
ggplot code
quelle
Ab matplotlib 3.1 können Sie verwenden
.legend_elements()
. Ein Beispiel finden Sie unter Automatische Legendenerstellung . Der Vorteil ist, dass ein einzelner Scatter-Aufruf verwendet werden kann.In diesem Fall:
Falls die Schlüssel nicht direkt als Zahlen angegeben wurden, würde dies so aussehen
quelle
fig, ax = plt.subplots(1, 1, figsize = (4,4)) scat = ax.scatter(rand_jitter(important_dataframe["workout_type_int"], jitter = 0.04), important_dataframe["distance"], c = color_list, marker = 'o', alpha = 0.9) print(scat.legends_elements()) #ax.legend(*scat.legend_elements())
legends_elements
undlegend_elements
.Es ist ziemlich hacky, aber man konnte verwenden
one1
alsFloat64Index
alles auf einmal zu tun:Beachten Sie, dass ab 0.20.3 das Sortieren des Index erforderlich ist und die Legende etwas wackelig ist .
quelle