Cómo trazar diferentes grupos de datos de un marco de datos en una sola figura

3 minutos de lectura

avatar de usuario
wuwucat

Tengo un archivo de temperatura con registros de temperatura de muchos años, en un formato como el siguiente:

2012-04-12,16:13:09,20.6
2012-04-12,17:13:09,20.9
2012-04-12,18:13:09,20.6
2007-05-12,19:13:09,5.4
2007-05-12,20:13:09,20.6
2007-05-12,20:13:09,20.6
2005-08-11,11:13:09,20.6
2005-08-11,11:13:09,17.5
2005-08-13,07:13:09,20.6
2006-04-13,01:13:09,20.6

Cada año tiene diferentes números, hora de los registros, por lo que los índices de fecha y hora de los pandas son todos diferentes.

Quiero trazar los datos de los diferentes años en la misma figura para comparar. El eje X es de enero a diciembre, el eje Y es la temperatura. ¿Cómo debo hacer esto?

Probar:

ax = df1.plot()
df2.plot(ax=ax)

avatar de usuario
Hamish Robertson

Si tiene un portátil Jupyter/Ipython en ejecución y tiene problemas para usarlo;

ax = df1.plot()

df2.plot(ax=ax)

¡Ejecute el comando dentro de la misma celda! Por alguna razón, no funcionará cuando se separen en celdas secuenciales. Al menos para mí.

avatar de usuario
Andy Hayden

  • La respuesta de Chang muestra cómo trazar un DataFrame diferente en el mismo axes.
  • En este caso, todos los datos están en el mismo marco de datos, por lo que es mejor usar groupby y unstack.
    • Alternativamente, pandas.DataFrame.pivot_table puede ser usado.
    • dfp = df.pivot_table(index='Month', columns="Year", values="value", aggfunc="mean")
  • Cuando usas pandas.read_csv, names= crea encabezados de columna cuando no hay ninguno en el archivo. los 'date' la columna debe ser analizada en datetime64[ns] Dtype entonces el .dt El extractor se puede utilizar para extraer el month y year.
import pandas as pd

# given the data in a file as shown in the op
df = pd.read_csv('temp.csv', names=['date', 'time', 'value'], parse_dates=['date'])
    
# create additional month and year columns for convenience
df['Year'] = df.date.dt.year
df['Month'] = df.date.dt.month

# groupby the month a year and aggreate mean on the value column
dfg = df.groupby(['Month', 'Year'])['value'].mean().unstack()

# display(dfg)                     
Year        2005  2006       2007  2012
Month                                  
4            NaN  20.6        NaN  20.7
5            NaN   NaN  15.533333   NaN
8      19.566667   NaN        NaN   NaN

Ahora es fácil trazar cada año como una línea separada. El OP solo tiene una observación para cada año, por lo que solo se muestra un marcador.

ax = dfg.plot(figsize=(9, 7), marker=".", xticks=dfg.index)

ingrese la descripción de la imagen aquí

avatar de usuario
adivis12

Para hacer esto para múltiples marcos de datos, puede hacer un bucle for sobre ellos:

fig = plt.figure(num=None, figsize=(10, 8))
ax = dict_of_dfs['FOO'].column.plot()
for BAR in dict_of_dfs.keys():
    if BAR == 'FOO':
        pass
    else:
        dict_of_dfs[BAR].column.plot(ax=ax)

Esto también se puede implementar sin la if condición:

fig, ax = plt.subplots()
for BAR in dict_of_dfs.keys():
    dict_of_dfs[BAR].plot(ax=ax)

Puedes hacer uso de la hue parámetro en seaborn. Por ejemplo:

import seaborn as sns
df = sns.load_dataset('flights')

     year month  passengers
0    1949   Jan         112
1    1949   Feb         118
2    1949   Mar         132
3    1949   Apr         129
4    1949   May         121
..    ...   ...         ...
139  1960   Aug         606
140  1960   Sep         508
141  1960   Oct         461
142  1960   Nov         390
143  1960   Dec         432

sns.lineplot(x='month', y='passengers', hue="year", data=df)

ingrese la descripción de la imagen aquí

¿Ha sido útil esta solución?