faire matplotlib des nuages de points de dataframes en Python pandas
Quelle est la meilleure façon de faire une série de diagrammes de dispersion à l'aide de matplotlib
à partir d'un pandas
dataframe en Python?
Par exemple, si j'ai un dataframe df
qui a certaines colonnes d'intérêt, je me retrouve généralement la conversion de tout à des tableaux:
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])
Le problème avec la conversion de tout à la gamme avant de traçage est qu'il vous oblige à sortir de dataframes.
Tenir compte de ces deux cas d'utilisation où le fait d'avoir la pleine dataframe est essentiel de tracé:
-
Par exemple, que faire si vous voulez maintenant, regardez toutes les valeurs de
col3
pour les valeurs correspondantes que vous tracées dans l'appel àscatter
, et la couleur de chaque point (ou la taille) par cette valeur? Vous devriez revenir en arrière, tirez le non-na valeurs decol1,col2
et vérifier ce que les valeurs correspondantes.Est-il un moyen de la parcelle, tout en préservant le dataframe? Par exemple:
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"])
-
De même, imaginez que vous vouliez filtre ou de la couleur de chaque point de manière différente selon les valeurs de certaines de ses colonnes. E. g. que faire si vous voulez automatiquement tracer les étiquettes des points qui répondent à un certain coupure sur
col1, col2
côtés (où les étiquettes sont stockées dans une autre colonne de la df), ou de la couleur de ces points différemment, comme le font les gens avec dataframes dans R. Par exemple: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)
Comment cela peut-il être fait?
MODIFIER Répondre à crewbum:
Vous dire que la meilleure façon est de tracer chaque condition (comme subset_a
, subset_b
) séparément. Que faire si vous avez beaucoup de conditions, par exemple, vous souhaitez diviser le disperse en 4 types de points ou même plus, de tracer chaque dans différentes, la forme et la couleur. Comment pouvez-vous élégamment appliquer la condition a, b, c, etc. et assurez-vous de considérer que "le reste" (les choses, non pas dans l'une de ces conditions) comme la dernière étape?
De même dans votre exemple où vous intrigue col1,col2
différemment, en fonction de col3
, si il y a NA valeurs de rompre l'association entre col1,col2,col3
? Par exemple, si vous voulez tracer tous les col2
valeurs en fonction de leur col3
valeurs, mais certaines lignes ont un NA valeur dans col1
ou col3
, vous forçant à utiliser dropna
premier. Donc, vous n':
mydata = df.dropna(how="any", subset=["col1", "col2", "col3")
ensuite, vous pouvez tracer à l'aide de mydata
comme vous montrer -- le tracé de la éparpillement entre col1,col2
en utilisant les valeurs de col3
. Mais mydata
sera absent de certains points qui ont des valeurs pour col1,col2
mais NA pour col3
, et ceux qui ont encore à être tracée... alors, comment voulez-vous fondamentalement tracer "le reste" des données, c'est à dire les points qui sont pas dans la liste filtrée mydata
?
- Les choses les changements dans le temps, voir Tracé Tracé - Scatter plot à partir de la documentation officielle.
Vous devez vous connecter pour publier un commentaire.
Essayer de passer les colonnes de la
DataFrame
directement à matplotlib, comme dans les exemples ci-dessous, au lieu de l'extraction d'eux comme des tableaux numpy.Varier d'éparpillement point de taille basée sur une autre colonne
Varier d'éparpillement point de couleur sur une autre colonne
Nuage de points avec la légende
Cependant, la façon la plus simple que j'ai trouvé pour créer un nuage de points avec la légende est d'appeler
plt.scatter
une fois pour chaque type de point.Mise à jour
De ce que je peux dire, matplotlib simplement saute des points avec NA x/y de coordonnées ou de NA paramètres de style (p. ex., la couleur/taille). Pour trouver les points ignorés en raison de NA, essayez de le
isnull
méthode:df[df.col3.isnull()]
De diviser une liste de points dans de nombreux types, jetez un oeil à numpy
select
, qui est un vectorisé si-alors-sinon la mise en œuvre et accepte une option valeur par défaut. Par exemple:plt.legend(scatterpoints=1, markerscale=1.5)
Il y a peu à ajouter à Garrett grande réponse, mais les pandas a aussi un
scatter
méthode. En utilisant cela, c'est aussi simple que