Pregunta Trazar datos agrupados en la misma parcela usando Pandas


En Pandas, estoy haciendo:

bp = p_df.groupby('class').plot(kind='kde')

p_df es un dataframe objeto.

Sin embargo, esto está produciendo dos tramas, una para cada clase. ¿Cómo fuerzo un argumento con ambas clases en el mismo diagrama?


29
2018-02-03 06:54


origen


Respuestas:


Versión 1:

Puedes crear tu eje y luego usar ax palabra clave de DataFrameGroupBy.plot para agregar todo a estos ejes:

import matplotlib.pyplot as plt

p_df = pd.DataFrame({"class": [1,1,2,2,1], "a": [2,3,2,3,2]})
fig, ax = plt.subplots(figsize=(8,6))
bp = p_df.groupby('class').plot(kind='kde', ax=ax)

Este es el resultado:

plot

Desafortunadamente, el etiquetado de la leyenda no tiene demasiado sentido aquí.

Versión 2:

Otra forma sería recorrer los grupos y trazar las curvas manualmente:

classes = ["class 1"] * 5 + ["class 2"] * 5
vals = [1,3,5,1,3] + [2,6,7,5,2]
p_df = pd.DataFrame({"class": classes, "vals": vals})

fig, ax = plt.subplots(figsize=(8,6))
for label, df in p_df.groupby('class'):
    df.vals.plot(kind="kde", ax=ax, label=label)
plt.legend()

De esta forma puedes controlar fácilmente la leyenda. Este es el resultado:

plot2


48
2018-02-03 12:40



Otro enfoque sería usar seaborn módulo. Esto trazaría las dos estimaciones de densidad en los mismos ejes sin especificar una variable para mantener los ejes de la siguiente manera (usando una configuración de marco de datos de la otra respuesta):

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

# data to create an example data frame
classes = ["c1"] * 5 + ["c2"] * 5
vals = [1,3,5,1,3] + [2,6,7,5,2]
# the data frame 
df = pd.DataFrame({"cls": classes, "indices":idx, "vals": vals})

# this is to plot the kde
sns.kdeplot(df.vals[df.cls == "c1"],label='c1');
sns.kdeplot(df.vals[df.cls == "c2"],label='c2');

# beautifying the labels
plt.xlabel('value')
plt.ylabel('density')
plt.show()

Esto da como resultado la siguiente imagen.

Resulting image from the code given above.


7
2017-09-01 21:37