Comment tracer deux colonnes d'une trame de données pandas en utilisant des points?

96

J'ai un cadre de données pandas et je voudrais tracer les valeurs d'une colonne par rapport aux valeurs d'une autre colonne. Heureusement, il existe une plotméthode associée aux cadres de données qui semble faire ce dont j'ai besoin:

df.plot(x='col_name_1', y='col_name_2')

Malheureusement, il semble que parmi les styles de tracé (listés ici après le kindparamètre), il n'y a pas de points. Je peux utiliser des lignes ou des barres ou même de la densité mais pas des points. Existe-t-il un moyen de contourner ce problème?

romain
la source

Réponses:

115

Vous pouvez spécifier le stylede la ligne tracée lors de l'appel df.plot:

df.plot(x='col_name_1', y='col_name_2', style='o')

L' styleargument peut également être un dictou list, par exemple:

import numpy as np
import pandas as pd

d = {'one' : np.random.rand(10),
     'two' : np.random.rand(10)}

df = pd.DataFrame(d)

df.plot(style=['o','rx'])

Tous les formats de style acceptés sont répertoriés dans la documentation de matplotlib.pyplot.plot.

Production

sodd
la source
78

Pour cela (et pour la plupart des tracés), je ne me fierais pas aux wrappers Pandas pour matplotlib. Au lieu de cela, utilisez simplement matplotlib directement:

import matplotlib.pyplot as plt
plt.scatter(df['col_name_1'], df['col_name_2'])
plt.show() # Depending on whether you use IPython or interactive mode, etc.

et rappelez-vous que vous pouvez accéder à un tableau NumPy des valeurs de la colonne avec df.col_name_1.valuespar exemple.

J'ai rencontré des problèmes en utilisant cela avec le traçage par défaut de Pandas dans le cas d'une colonne de valeurs d'horodatage avec une précision de la milliseconde. En essayant de convertir les objets en datetime64type, j'ai également découvert un problème désagréable: < Pandas donne un résultat incorrect en demandant si les valeurs de la colonne Timestamp ont un type attr >.

ely
la source
3

Pandasutilise matplotlibcomme bibliothèque pour les graphiques de base. Le moyen le plus simple dans votre cas utilisera ce qui suit:

import pandas as pd
import numpy as np

#creating sample data 
sample_data={'col_name_1':np.random.rand(20),
      'col_name_2': np.random.rand(20)}
df= pd.DataFrame(sample_data)
df.plot(x='col_name_1', y='col_name_2', style='o')

entrez la description de l'image ici

Cependant, je recommanderais d'utiliser seaborncomme solution alternative si vous voulez avoir des parcelles plus personnalisées sans entrer dans le niveau de base de matplotlib.Dans ce cas, la solution sera la suivante:

import pandas as pd
import seaborn as sns
import numpy as np

#creating sample data 
sample_data={'col_name_1':np.random.rand(20),
      'col_name_2': np.random.rand(20)}
df= pd.DataFrame(sample_data)
sns.scatterplot(x="col_name_1", y="col_name_2", data=df)

entrez la description de l'image ici

Dr Arslan
la source