Was ist der beste Weg, um eine Reihe von Streudiagrammen mithilfe matplotlib
eines pandas
Datenrahmens in Python zu erstellen?
Wenn ich beispielsweise einen Datenrahmen df
mit einigen interessanten Spalten habe, konvertiere ich normalerweise alles in Arrays:
import matplotlib.pylab as plt
# df is a DataFrame: fetch col1 and col2
# and drop na rows if any of the columns are NA
mydata = df[["col1", "col2"]].dropna(how="any")
# Now plot with matplotlib
vals = mydata.values
plt.scatter(vals[:, 0], vals[:, 1])
Das Problem beim Konvertieren von allem in ein Array vor dem Plotten besteht darin, dass Sie gezwungen sind, aus Datenrahmen auszubrechen.
Betrachten Sie diese beiden Anwendungsfälle, in denen der vollständige Datenrahmen für das Plotten unerlässlich ist:
Was wäre zum Beispiel, wenn Sie jetzt alle Werte
col3
für die entsprechenden Werte anzeigen möchten, die Sie im Aufruf gezeichnet habenscatter
, und jeden Punkt (oder jede Größe) mit diesem Wert färben möchten? Sie müssten zurückgehen, die Nicht-Na-Werte von herausziehen und diecol1,col2
entsprechenden Werte überprüfen.Gibt es eine Möglichkeit zum Plotten unter Beibehaltung des Datenrahmens? Zum Beispiel:
mydata = df.dropna(how="any", subset=["col1", "col2"]) # plot a scatter of col1 by col2, with sizes according to col3 scatter(mydata(["col1", "col2"]), s=mydata["col3"])
Stellen Sie sich vor, Sie möchten jeden Punkt abhängig von den Werten einiger Spalten unterschiedlich filtern oder färben. Was wäre beispielsweise, wenn Sie die Beschriftungen der Punkte, die einen bestimmten Grenzwert treffen, automatisch neben sich zeichnen
col1, col2
möchten (wobei die Beschriftungen in einer anderen Spalte des df gespeichert sind) oder diese Punkte anders färben möchten, wie dies bei Datenrahmen in R der Fall ist Beispiel:mydata = df.dropna(how="any", subset=["col1", "col2"]) myscatter = scatter(mydata[["col1", "col2"]], s=1) # Plot in red, with smaller size, all the points that # have a col2 value greater than 0.5 myscatter.replot(mydata["col2"] > 0.5, color="red", s=0.5)
Wie kann das gemacht werden?
EDIT Antwort crewbum:
Sie sagen, dass der beste Weg ist, jede Bedingung (wie subset_a
, subset_b
) separat zu zeichnen . Was ist, wenn Sie viele Bedingungen haben, z. B. wenn Sie die Streuungen in 4 Arten von Punkten oder sogar mehr aufteilen möchten, wobei Sie jede in unterschiedlicher Form / Farbe zeichnen möchten. Wie können Sie die Bedingungen a, b, c usw. elegant anwenden und sicherstellen, dass Sie als letzten Schritt "den Rest" (Dinge, die in keiner dieser Bedingungen enthalten sind) zeichnen?
Ähnlich verhält es sich in Ihrem Beispiel, in dem Sie je nach Darstellung col1,col2
unterschiedlich darstellen, mit col3
NA-Werten, die die Zuordnung zwischen diesen Werten aufheben col1,col2,col3
? Zum Beispiel, wenn Sie alle col2
Werte basierend auf ihren col3
Werten zeichnen möchten , aber einige Zeilen einen NA-Wert in entweder col1
oder haben col3
, was Sie dazu zwingt, zuerst zu verwenden dropna
. Also würden Sie tun:
mydata = df.dropna(how="any", subset=["col1", "col2", "col3")
Dann können Sie mit mydata
wie gezeigt zeichnen - die Streuung zwischen col1,col2
den Werten von col3
. Es mydata
fehlen jedoch einige Punkte, für die Werte col1,col2
vorliegen col3
, für die jedoch NA angegeben sind , und die noch gezeichnet werden müssen. Wie würden Sie also im Grunde "den Rest" der Daten darstellen, dh die Punkte, die nicht in der gefilterten Menge enthalten sind mydata
?