Plote diferentes DataFrames na mesma figura

92

Eu tenho um arquivo de temperatura com registros de temperatura de muitos anos, em um formato como abaixo:

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 ano tem diferentes números, tempo dos registros, então os índices de data e hora dos pandas são todos diferentes.

Quero representar graficamente os dados de diferentes anos na mesma figura para comparação. O eixo X é de janeiro a dezembro, o eixo Y é a temperatura. Como devo fazer isso?

wuwucat
fonte

Respostas:

30

Embora a resposta de Chang explique como plotar várias vezes na mesma figura, neste caso, pode ser melhor usar um groupbye unstacking:

(Supondo que você tenha isso no dataframe, com o índice datetime já)

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

Agora é fácil traçar (cada ano como uma linha separada):

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

Experimentar:

ax = df1.plot()
df2.plot(ax=ax)
Chang She
fonte
1
se for no notebook ipython, como conseguir? existe uma função de retenção ou exibição que imprime o gráfico somente após todas as configurações serem definidas?
Diansheng
1
Defina %matplotlib inlineonde você faz suas importações para que suas visualizações apareçam nos blocos de anotações do iPython.
Hassan Baig de
1
Alguma pista de como isso funcionaria se houvesse mais de 3 dataframes?
RPT de
Isso é incrível. Vou responder sobre como fazer com mais de 3 dfs
adivis12
3
Tem certeza de que isso funciona para qualquer tipo de plot(), ou seja, sempre que qualquer tipo de especificação é passado como argumento para a plotfunção?
acelerado em
26

Se você está executando um notebook Jupyter / Ipython e está tendo problemas para usar;

ax = df1.plot()

df2.plot(ax=ax)

Execute o comando dentro da mesma célula !! Não funcionará, por algum motivo, quando eles são separados em células sequenciais. Para mim, pelo menos.

Hamish Robertson
fonte
6

Para fazer isso para vários dataframes, você pode fazer um loop for sobre eles:

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

Apenas para melhorar a resposta @ adivis12, você não precisa fazer a ifdeclaração. Coloque assim:

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