Aggiungi etichette xey a un grafico panda


197

Supponiamo che io abbia il seguente codice che traccia qualcosa di molto semplice usando i panda:

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

Produzione

Come posso impostare facilmente le etichette x e y preservando la mia capacità di usare specifiche mappe colori? Ho notato che il plot()wrapper per Panda DataFrames non accetta parametri specifici per questo.

Risposte:


329

La df.plot()funzione restituisce un matplotlib.axes.AxesSubplotoggetto. È possibile impostare le etichette su quell'oggetto.

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

inserisci qui la descrizione dell'immagine

O, più brevemente: ax.set(xlabel="x label", ylabel="y label").

In alternativa, l'etichetta dell'asse x dell'indice viene automaticamente impostata sul nome dell'indice, se ne ha uno. così df2.index.name = 'x label'funzionerebbe anche.


71
c'è un motivo particolare per cui non è possibile aggiungere etichette xey come argomenti pd.plot()? Data l'ulteriore concisione di pd.plot()over plt.plot()sembra che avrebbe senso renderlo ancora più conciso invece di dover chiamare ax.set_ylabel().
Chrispy,

Quando l'ho fatto ax.set_ylabel("y label"), restituisce un errore 'list' object is not callable. Qualche idea?
Ledger Yu,

Interessante. Non so se dipende dalla versione, ma dovrò farlo ax.axes.set_ylabel("y label").
Ledger Yu,

2
Penso che potresti dare il ax.set(xlabel='...)massimo in questa risposta in quanto potrebbe essere perso oltre il grafico. È davvero l'approccio più succinto per impostare entrambi gli assi, che è il caso d'uso comune.
poulter7,

Come si imposta la posizione?
Odisseo,

44

Puoi usarlo in questo modo:

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

Ovviamente devi sostituire le stringhe 'xlabel' e 'ylabel' con ciò che vuoi che siano.


Si noti inoltre che è necessario chiamare plt.xlabel()ecc. Dopo df.plot(), non prima, poiché altrimenti si ottengono due grafici: le chiamate modificheranno un diagramma "precedente". La stessa cosa vale plt.title().
Tomasz Gandor,

30

Se si etichettano le colonne e l'indice di DataFrame, i panda forniranno automaticamente le etichette appropriate:

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

inserisci qui la descrizione dell'immagine

In questo caso, dovrai comunque fornire manualmente le etichette y (ad esempio, plt.ylabelcome mostrato nelle altre risposte).


attualmente, la "fornitura automatica da DataFrame" non funziona. L'ho appena provato (panda versione 0.16.0, matplotlib 1.4.3) e la trama si genera correttamente, ma senza etichette sugli assi.
szeitlin,

1
@szeitlin potresti per favore presentare una segnalazione di bug sulla pagina pithas github? github.com/pydata/pandas/issues
shoyer

sai cosa, oggi almeno la xlabel sta funzionando. forse c'era qualcosa di strano nel frame di dati che stavo usando ieri (?). se riesco a riprodurlo, lo archivierò!
szeitlin,

20

È possibile impostare entrambe le etichette insieme alla axis.setfunzione. Cerca l'esempio:

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

inserisci qui la descrizione dell'immagine


3
Mi piace la .set(xlabel='x axis', ylabel='y axis')soluzione perché mi permette di mettere tutto in una riga, a differenza dei metodi di trama set_xlabel e set_ylabel. Mi chiedo perché tutti (incluso il metodo set, tra l'altro) non restituiscono l'oggetto trama o almeno qualcosa ereditato da esso.
tollerante ai guasti

14

Per i casi in cui si utilizza pandas.DataFrame.hist:

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

Nota che ottieni un ARRAY di grafici, piuttosto che un diagramma. Quindi per impostare l'etichetta x dovrai fare qualcosa del genere

plt[0][0].set_xlabel("column A")

10

che dire ...

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

pandasutilizza matplotlibper i grafici di base dei frame di dati. Pertanto, se si utilizza pandasper la trama di base, è possibile utilizzare matplotlib per la personalizzazione della trama. Tuttavia, propongo qui un metodo alternativo seabornche consente di personalizzare ulteriormente la trama senza passare al livello base di matplotlib.

Codice di lavoro:

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

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.