Agregue etiquetas x e y a un diagrama de pandas

197

Supongamos que tengo el siguiente código que traza algo muy simple 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')

Salida

¿Cómo configuro fácilmente las etiquetas x e y mientras mantengo mi capacidad de usar mapas de colores específicos? Noté que el plot()contenedor para pandas DataFrames no toma ningún parámetro específico para eso.

Everaldo Aguiar
fuente

Respuestas:

329

La df.plot()función devuelve un matplotlib.axes.AxesSubplotobjeto. Puede establecer las etiquetas en ese 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")

ingrese la descripción de la imagen aquí

O, más brevemente: ax.set(xlabel="x label", ylabel="y label").

Alternativamente, la etiqueta del eje x del índice se establece automáticamente en el nombre del índice, si tiene uno. también df2.index.name = 'x label'funcionaría

TomAugspurger
fuente
71
¿Hay alguna razón particular por la cual las etiquetas x e y no se puedan agregar como argumentos pd.plot()? Dada la concisión adicional de pd.plot()over plt.plot(), parece que tendría sentido hacerlo aún más conciso en lugar de tener que llamar ax.set_ylabel().
Chrispy
Cuando lo hice ax.set_ylabel("y label"), devuelve un error 'list' object is not callable. ¿Alguna idea?
Ledger Yu
Interesante. No sé si depende de la versión, pero tendré que hacerlo ax.axes.set_ylabel("y label").
Ledger Yu
2
Creo que podría poner el ax.set(xlabel='...)más alto en esta respuesta, ya que podría pasarse por alto el gráfico. Realmente es el enfoque más sucinto para establecer ambos ejes, que es el caso de uso común.
poulter7
¿Cómo se configura la ubicación?
Odisseo
44

Puedes usar hacerlo así:

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, debe reemplazar las cadenas 'xlabel' e 'ylabel' con lo que desea que sean.

jesukumar
fuente
También tenga en cuenta que debe llamar, plt.xlabel()etc. df.plot(), después , no antes, porque de lo contrario obtendrá dos parcelas: las llamadas modificarán una trama "anterior". Lo mismo vale para plt.title().
Tomasz Gandor
30

Si etiqueta las columnas y el índice de su DataFrame, los pandas proporcionarán automáticamente las etiquetas apropiadas:

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

ingrese la descripción de la imagen aquí

En este caso, aún necesitará suministrar etiquetas y manualmente (por ejemplo, a través de plt.ylabelcomo se muestra en las otras respuestas).

shoyer
fuente
actualmente, ese 'suministro automático de DataFrame' no funciona. Lo acabo de probar (pandas versión 0.16.0, matplotlib 1.4.3) y la trama se genera correctamente, pero sin etiquetas en los ejes.
szeitlin
1
@szeitlin, ¿podría presentar un informe de error en la página de pandas github? github.com/pydata/pandas/issues
shoyer
sabes qué, hoy al menos el xlabel está funcionando. tal vez había algo extraño en el marco de datos que estaba usando ayer (?). si puedo reproducirlo, lo archivaré!
szeitlin
20

Es posible establecer ambas etiquetas junto con la axis.setfunción. Busque el ejemplo:

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

ingrese la descripción de la imagen aquí

Serenidad
fuente
3
Me gusta la .set(xlabel='x axis', ylabel='y axis')solución porque me permite ponerlo todo en una línea, a diferencia de los métodos de trazado set_xlabel y set_ylabel. Me pregunto por qué todos (incluido el método set, por cierto) no devuelven el objeto de trazado o al menos algo heredado de él.
tolerante a fallas el
14

Para casos en los que usa pandas.DataFrame.hist:

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

Tenga en cuenta que obtiene un ARRAY de tramas, en lugar de una trama. Por lo tanto, para establecer la etiqueta x, deberá hacer algo como esto

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

qué pasa ...

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

pandasusos matplotlibpara tramas básicas de trama de datos. Por lo tanto, si está utilizando pandasla trama básica, puede usar matplotlib para la personalización de la trama. Sin embargo, propongo un método alternativo aquí seabornque permite una mayor personalización de la trama sin entrar en el nivel básico de matplotlib.

Código de trabajo

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

ingrese la descripción de la imagen aquí

Dr. Arslan
fuente