web-dev-qa-db-fra.com

Tracer plusieurs nuages ​​de points pandas

Je pense qu'il y a beaucoup de questions sur le traçage de plusieurs graphiques mais pas spécifiquement pour ce cas comme indiqué ci-dessous.

La documentation pandas dit de "répéter la méthode de tracé" pour tracer plusieurs groupes de colonnes sur un seul axe. Cependant, comment cela fonctionnerait-il pour 3 groupes de colonnes ou plus? Par exemple, si nous définissons une troisième colonne :

bx = df.plot(kind='scatter', x='a',y='f',color = 'Green',label ='f')

Où serait passé ce bx?

De plus, si le tracé est le même graphique, l'axe des x ne devrait-il pas être systématiquement "a" ou "c"? mais la documentation a 2 axes x différents: 'a' et 'c'

enter image description here

8
Amoroso

Où serait passé ce bx?

Vous devez répéter le deuxième appel à plot, pas le premier, donc il n'est pas nécessaire de bx.

En détail: plot taxe un argument ax facultatif. Ce sont les axes dans lesquels il dessine. Si l'argument n'est pas fourni, la fonction crée un nouveau tracé et des axes. De plus, les axes sont renvoyés par la fonction afin de pouvoir être réutilisés pour d'autres opérations de dessin. L'idée est pas de passer un argument ax au premier appel à plot et d'utiliser les axes retournés dans tous appels suivants.

Vous pouvez vérifier que chaque appel à plot renvoie les mêmes axes qu'il a passés:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(100, 6), columns=['a', 'b', 'c', 'd', 'e', 'f'])


ax1 = df.plot(kind='scatter', x='a', y='b', color='r')    
ax2 = df.plot(kind='scatter', x='c', y='d', color='g', ax=ax1)    
ax3 = df.plot(kind='scatter', x='e', y='f', color='b', ax=ax1)

print(ax1 == ax2 == ax3)  # True

enter image description here

De plus, si le tracé est le même graphique, l'axe des x ne devrait-il pas être systématiquement "a" ou "c"?

Pas nécessairement. S'il est logique de placer différentes colonnes sur les mêmes axes, cela dépend des données qu'elles représentent. Par exemple, si a était un revenu et c était une dépense, il serait logique de placer les deux sur le même axe "monétaire". En revanche, si a était le nombre de pois et c était la tension, ils ne devraient probablement pas être sur le même axe.

10
kazemakase

Vous pouvez tracer n'importe quelle colonne contre n'importe quelle colonne que vous aimez. Si cela a du sens, vous devez décider par vous-même. Par exemple. tracer une colonne indiquant le temps sur le même axe qu'une colonne indiquant la distance peut ne pas avoir de sens, mais tracer deux colonnes qui contiennent toutes deux la distance sur le même axe, est très bien.

Afin de spécifier qu'un tracé de certin doit être sur un axe déjà existant (ax), vous devez spécifier le mot clé ax comme indiqué dans la documentation. De couse vous pouvez créer plusieurs tracés sur les mêmes axes.

ax = df.plot(kind="scatter", x="x",y="a", color="b", label="a vs. x")
df.plot(x="x",y="b", color="r", label="b vs. x", ax=ax)
df.plot( x="x",y="c", color="g", label="c vs. x", ax=ax)

Un exemple complet:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,6.3, 50)
a = (np.sin(x)+1)*3
b = (np.cos(x)+1)*3
c = np.ones_like(x)*3
d = np.exp(x)/100.
df = pd.DataFrame({"x":x, "a":a, "b":b, "c":c, "d":d})

ax = df.plot(kind="scatter", x="x",y="a", color="b", label="a vs. x")
df.plot(x="x",y="b", color="r", label="b vs. x", ax=ax)
df.plot( x="x",y="c", color="g", label="c vs. x", ax=ax)
df.plot( x="d",y="x", color="orange", label="b vs. d", ax=ax)
df.plot( x="a",y="x", color="purple", label="x vs. a", ax=ax)

ax.set_xlabel("horizontal label")
ax.set_ylabel("vertical label")
plt.show()

enter image description here

À l'intérieur du verset pyviz il y a une bibliothèque appelée hvplot qui fournit une fonctionnalité de traçage de haut niveau très agréable (en plus de holoviews ) qui fonctionne avec les pandas:

import numpy as np
import hvplot.pandas

df = pd.DataFrame(np.random.randn(100, 6), columns=['a', 'b', 'c', 'd', 'e', 'f'])

df.hvplot(x='a', y=['b', 'c', 'd', 'e'], kind='scatter')

enter image description here

0
user2739472