Adicione rótulos x e y a um gráfico de pandas

195

Suponha que eu tenha o seguinte código que plota algo muito simples usando 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')

Resultado

Como defino facilmente os rótulos x e y, preservando minha capacidade de usar mapas de cores específicos? Notei que o plot()invólucro para DataFrames do pandas não aceita parâmetros específicos para isso.

Everaldo Aguiar
fonte

Respostas:

327

A df.plot()função retorna um matplotlib.axes.AxesSubplotobjeto. Você pode definir os rótulos nesse objeto.

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

insira a descrição da imagem aqui

Ou, de forma mais sucinta: ax.set(xlabel="x label", ylabel="y label").

Como alternativa, o rótulo do eixo x do índice é automaticamente definido como o nome do Índice, se houver um. assim df2.index.name = 'x label'também funcionaria.

TomAugspurger
fonte
71
existe uma razão específica pela qual os rótulos xey não podem ser adicionados como argumentos pd.plot()? Dada a concisão adicional do pd.plot()excesso plt.plot(), parece que faria sentido torná-lo ainda mais sucinto em vez de ter que ligar ax.set_ylabel().
Chrispy
Quando eu fiz ax.set_ylabel("y label"), ele retorna um erro 'list' object is not callable. Qualquer ideia?
Ledger Yu
Interessante. Não sei se depende da versão, mas vou ter que fazer ax.axes.set_ylabel("y label").
Ledger Yu
2
Eu acho que você poderia colocar o ax.set(xlabel='...)mais alto nesta resposta, pois pode ser que você tenha perdido o gráfico. É realmente a abordagem mais sucinta para definir os dois eixos, que é o caso comum.
poulter7
Como você define o local?
Odisseo 3/10/19
43

Você pode usar assim:

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

Obviamente, você precisa substituir as seqüências de caracteres 'xlabel' e 'ylabel' pelo que deseja que elas sejam.

jesukumar
fonte
Observe também que você precisa ligar plt.xlabel()etc. depois df.plot(), não antes, porque, caso contrário, você recebe dois gráficos - as chamadas modificarão um gráfico "anterior". A mesma coisa vale para plt.title().
Tomasz Gandor
30

Se você rotular as colunas e o índice do seu DataFrame, os pandas fornecerão automaticamente os rótulos apropriados:

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

insira a descrição da imagem aqui

Nesse caso, você ainda precisará fornecer os rótulos y manualmente (por exemplo, via plt.ylabelcomo mostrado nas outras respostas).

shoyer
fonte
atualmente, esse 'fornecimento automático do DataFrame' não funciona. Eu apenas tentei (pandas versão 0.16.0, matplotlib 1.4.3) e o gráfico é gerado corretamente, mas sem rótulos nos eixos.
Szeitlin
1
@szeitlin, você poderia registrar um bug na página do pandas github? github.com/pydata/pandas/issues
shoyer
você sabe o que, hoje pelo menos o xlabel está funcionando. talvez houvesse algo estranho no dataframe que eu estava usando ontem (?). se eu conseguir reproduzi-lo, vou arquivá-lo!
Szeitlin
20

É possível definir os dois rótulos junto com a axis.setfunção. Procure o exemplo:

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

insira a descrição da imagem aqui

Serenidade
fonte
3
Gosto da .set(xlabel='x axis', ylabel='y axis')solução porque ela permite colocar tudo em uma linha, ao contrário dos métodos de plotagem set_xlabel e set_ylabel. Eu me pergunto por que todos eles (incluindo o método set, a propósito) não retornam o objeto de plotagem ou pelo menos algo herdado dele.
tolerante a falhas
14

Para casos em que você usa pandas.DataFrame.hist:

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

Observe que você recebe um ARRAY de plotagens, em vez de uma plotagem. Assim, para definir o rótulo x, você precisará fazer algo assim

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

A respeito ...

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
fonte
2

pandasusa matplotlibpara gráficos básicos de quadro de dados. Portanto, se você estiver usando pandaso plot básico, poderá usar o matplotlib para personalizar o plot. No entanto, proponho aqui um método alternativo seabornque permite mais personalização do gráfico, sem entrar no nível básico de matplotlib.

Código de trabalho:

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

insira a descrição da imagem aqui

Dr. Arslan
fonte