110 votes

Comment tracer deux colonnes d'un cadre de données pandas à l'aide de points ?

J'ai un dataframe pandas et je voudrais tracer les valeurs d'une colonne par rapport aux valeurs d'une autre colonne. Heureusement, il existe plot 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 parcelles (listés ici après le kind paramètre) il n'y a pas de points. Je peux utiliser des lignes, des barres ou même une densité, mais pas de points. Existe-t-il une solution pour résoudre ce problème ?

139voto

hooy Points 7973

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

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

El style peut également être un dict o 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 l'application matplotlib.pyplot.plot .

Output

91voto

EMS Points 9249

Pour cela (et pour la plupart des tracés), je ne compterais pas sur les wrappers Pandas de matplotlib. Au lieu de cela, il suffit d'utiliser directement matplotlib :

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.values par exemple.

J'ai eu des difficultés à l'utiliser avec le tracé par défaut de Pandas dans le cas d'une colonne de valeurs d'horodatage avec une précision de l'ordre de la milliseconde. En essayant de convertir les objets en datetime64 type, j'ai aussi découvert un problème désagréable : < Pandas donne un résultat incorrect lorsqu'il demande si les valeurs de la colonne Timestamp ont un attr astype. >.

9voto

Arslan Ahmad Points 153

Pandas utilise matplotlib comme une bibliothèque pour les parcelles de base. La méthode la plus simple dans votre cas sera d'utiliser 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')

enter image description here

Cependant, je recommande d'utiliser seaborn comme une solution alternative si vous souhaitez avoir des parcelles plus personnalisées tout en n'entrant pas dans le niveau de base de l'application matplotlib. Dans ce cas, la solution est 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)

enter image description here

0voto

shantanu pathak Points 111

Dans la dernière version de pandas, vous pouvez maintenant utiliser directement la fonction df.plot.scatter.

df = pd.DataFrame([[5.1, 3.5, 0], [4.9, 3.0, 0], [7.0, 3.2, 1],
                   [6.4, 3.2, 1], [5.9, 3.0, 2]],
                  columns=['length', 'width', 'species'])
ax1 = df.plot.scatter(x='length',
                      y='width',
                      c='DarkBlue')

https://pandas.pydata.org/pandas-docs/version/0.23/generated/pandas.DataFrame.plot.scatter.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X