Trace diferentes DataFrames en la misma figura

92

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, la hora de los registros, por lo que los índices de fecha y hora de pandas son todos diferentes.

Quiero trazar los datos de 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?

wuwucat
fuente

Respuestas:

30

Aunque la respuesta de Chang explica cómo graficar varias veces en la misma figura, en este caso, es posible que sea mejor usar a groupbyy unstacking:

(Suponiendo que tiene esto en el marco de datos, con el índice de fecha y hora ya)

In [1]: df
Out[1]:
            value  
datetime                         
2010-01-01      1  
2010-02-01      1  
2009-01-01      1  

# create additional month and year columns for convenience
df['Month'] = map(lambda x: x.month, df.index)
df['Year'] = map(lambda x: x.year, df.index)    

In [5]: df.groupby(['Month','Year']).mean().unstack()
Out[5]:
       value      
Year    2009  2010
Month             
1          1     1
2        NaN     1

Ahora es fácil trazar (cada año como una línea separada):

df.groupby(['Month','Year']).mean().unstack().plot()
Andy Hayden
fuente
338

Tratar:

ax = df1.plot()
df2.plot(ax=ax)
Chang ella
fuente
1
si está en un portátil ipython, ¿cómo lograrlo? ¿Existe una función de retención o visualización que imprima el gráfico solo después de que se hayan establecido todos los ajustes?
Diansheng
1
Establezca %matplotlib inlinedónde realiza sus importaciones para que sus visualizaciones aparezcan dentro de los cuadernos iPython.
Hassan Baig
1
¿Alguna pista de cómo funcionaría esto si hubiera más de 3 marcos de datos?
RPT
Esto es increíble. Responderé sobre cómo hacerlo con más de 3
dfs
3
¿Está seguro de que esto funciona para cualquier tipo de plot(), es decir, cada vez que se pasa cualquier tipo de especificaciones como argumento a la plotfunción?
gented
26

Si tiene un cuaderno Jupyter / Ipython en ejecución y tiene problemas para usar;

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í.

Hamish Robertson
fuente
6

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)
adivis12
fuente
0

Solo para mejorar la respuesta de @ adivis12, no necesita hacer la ifdeclaración. Ponlo así:

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