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.

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.


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.


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).


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


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")

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()

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.