Ajouter des étiquettes x et y à un graphique de pandas

197

Supposons que j'ai le code suivant qui trace quelque chose de très simple en utilisant des pandas:

import pandas as pd
values = [[1, 2], [2, 5]]
df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], 
                   index=['Index 1', 'Index 2'])
df2.plot(lw=2, colormap='jet', marker='.', markersize=10, 
         title='Video streaming dropout by category')

Production

Comment définir facilement des étiquettes x et y tout en préservant ma capacité à utiliser des couleurs spécifiques? J'ai remarqué que le plot()wrapper pour pandas DataFrames ne prend aucun paramètre spécifique pour cela.

Everaldo Aguiar
la source

Réponses:

329

La df.plot()fonction renvoie un matplotlib.axes.AxesSubplotobjet. Vous pouvez définir les étiquettes sur cet objet.

ax = df2.plot(lw=2, colormap='jet', marker='.', markersize=10, title='Video streaming dropout by category')
ax.set_xlabel("x label")
ax.set_ylabel("y label")

entrez la description de l'image ici

Ou, plus succinctement: ax.set(xlabel="x label", ylabel="y label").

Sinon, l'étiquette de l'axe des x de l'index est automatiquement définie sur le nom de l'index, s'il en a un. cela df2.index.name = 'x label'fonctionnerait aussi.

TomAugspurger
la source
71
y a-t-il une raison particulière pour laquelle les étiquettes x et y ne peuvent pas être ajoutées comme arguments à pd.plot()? Compte tenu de la concision supplémentaire de pd.plot()plus, plt.plot()il semble qu'il serait logique de le rendre encore plus succinct au lieu d'avoir à appeler ax.set_ylabel().
Chrispy
Quand je l'ai fait ax.set_ylabel("y label"), cela renvoie une erreur 'list' object is not callable. Une idée?
Ledger Yu
Intéressant. Je ne sais pas si cela dépend de la version mais je vais devoir le faire ax.axes.set_ylabel("y label").
Ledger Yu
2
Je pense que vous pourriez mettre le ax.set(xlabel='...)plus haut dans cette réponse car elle pourrait passer au-delà du graphique. C'est vraiment l'approche la plus succincte pour définir les deux axes, ce qui est le cas d'utilisation courant.
poulter7
Comment définissez-vous l'emplacement?
Odisseo
45

Vous pouvez l'utiliser comme ceci:

import matplotlib.pyplot as plt 
import pandas as pd

plt.figure()
values = [[1, 2], [2, 5]]
df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], 
                   index=['Index 1', 'Index 2'])
df2.plot(lw=2, colormap='jet', marker='.', markersize=10,
         title='Video streaming dropout by category')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.show()

Évidemment, vous devez remplacer les chaînes «xlabel» et «ylabel» par ce que vous voulez qu'elles soient.

Jesukumar
la source
Notez également que vous devez appeler plt.xlabel()etc. après df.plot(), pas avant, car sinon vous obtenez deux tracés - les appels modifieront un tracé "précédent". C'est la même chose plt.title().
Tomasz Gandor le
30

Si vous étiquetez les colonnes et l'index de votre DataFrame, les pandas fourniront automatiquement les étiquettes appropriées:

import pandas as pd
values = [[1, 2], [2, 5]]
df = pd.DataFrame(values, columns=['Type A', 'Type B'], 
                  index=['Index 1', 'Index 2'])
df.columns.name = 'Type'
df.index.name = 'Index'
df.plot(lw=2, colormap='jet', marker='.', markersize=10, 
        title='Video streaming dropout by category')

entrez la description de l'image ici

Dans ce cas, vous devrez toujours fournir des étiquettes y manuellement (par exemple, via plt.ylabelcomme indiqué dans les autres réponses).

shoyer
la source
actuellement, cette «fourniture automatique de DataFrame» ne fonctionne pas. Je viens de l'essayer (pandas version 0.16.0, matplotlib 1.4.3) et le tracé génère correctement, mais sans étiquettes sur les axes.
szeitlin
1
@szeitlin pourriez-vous s'il vous plaît déposer un rapport de bogue sur la page pandas github? github.com/pydata/pandas/issues
shoyer
vous savez quoi, aujourd'hui au moins le xlabel fonctionne. peut-être qu'il y avait quelque chose d'étrange dans le dataframe que j'utilisais hier (?). si je peux le reproduire, je le déposerai!
szeitlin
20

Il est possible de définir les deux étiquettes avec la axis.setfonction. Cherchez l'exemple:

import pandas as pd
import matplotlib.pyplot as plt
values = [[1,2], [2,5]]
df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], index=['Index 1','Index 2'])
ax = df2.plot(lw=2,colormap='jet',marker='.',markersize=10,title='Video streaming dropout by category')
# set labels for both axes
ax.set(xlabel='x axis', ylabel='y axis')
plt.show()

entrez la description de l'image ici

Sérénité
la source
3
J'aime la .set(xlabel='x axis', ylabel='y axis')solution car elle me permet de tout mettre sur une seule ligne, contrairement aux méthodes de tracé set_xlabel et set_ylabel. Je me demande pourquoi tous (y compris la méthode set, d'ailleurs) ne renvoient pas l'objet de l'intrigue ou du moins quelque chose qui en a hérité.
tolérant aux pannes
14

Pour les cas où vous utilisez pandas.DataFrame.hist:

plt = df.Column_A.hist(bins=10)

Notez que vous obtenez un TABLEAU de parcelles, plutôt qu'un graphique. Ainsi, pour définir l'étiquette x, vous devrez faire quelque chose comme ça

plt[0][0].set_xlabel("column A")
Selah
la source
10

qu'en est-il de ...

import pandas as pd
import matplotlib.pyplot as plt

values = [[1,2], [2,5]]

df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], index=['Index 1','Index 2'])

(df2.plot(lw=2,
          colormap='jet',
          marker='.',
          markersize=10,
          title='Video streaming dropout by category')
    .set(xlabel='x axis',
         ylabel='y axis'))

plt.show()
Dror Hilman
la source
2

pandasutilise matplotlibpour les tracés de base de données. Donc, si vous utilisez pandaspour le tracé de base, vous pouvez utiliser matplotlib pour la personnalisation du tracé. Cependant, je propose ici une méthode alternative seabornqui permet une plus grande personnalisation de l'intrigue sans entrer dans le niveau de base de matplotlib.

Code de travail:

import pandas as pd
import seaborn as sns
values = [[1, 2], [2, 5]]
df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], 
                   index=['Index 1', 'Index 2'])
ax= sns.lineplot(data=df2, markers= True)
ax.set(xlabel='xlabel', ylabel='ylabel', title='Video streaming dropout by category') 

entrez la description de l'image ici

Dr Arslan
la source