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é:

  1. 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 de col1,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"])
  2. 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?

InformationsquelleAutor | 2013-01-13