Narysuj różne ramki DataFrames na tej samej figurze


93

Posiadam plik temperatur z wieloletnimi zapisami temperatur w formacie jak poniżej:

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

Każdy rok ma inne liczby, czas zapisów, więc wszystkie wskaźniki czasu i daty pand są różne.

Chcę wykreślić dane z różnych lat na tej samej figurze w celu porównania. Oś X to styczeń do grudnia, oś Y to temperatura. Jak mam się do tego zabrać?

Odpowiedzi:


30

Chociaż odpowiedź Changa wyjaśnia, jak wykreślić wiele razy na tej samej figurze, w tym przypadku może być lepiej w tym przypadku, używając a groupbyi unstacking:

(Zakładając, że masz to w dataframe, z już indeksem datetime)

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

Teraz łatwo jest wykreślić (każdy rok jako osobna linia):

df.groupby(['Month','Year']).mean().unstack().plot()

345

Próbować:

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

1
jeśli jest na notebooku ipython, jak to osiągnąć? czy istnieje funkcja wstrzymania lub pokazania, która drukuje wykres dopiero po ustawieniu wszystkich ustawień?
Diansheng

1
Ustaw %matplotlib inlinemiejsce importu, aby wizualizacje pojawiały się w notatnikach iPython.
Hassan Baig

1
Masz jakąś wskazówkę, jak by to działało, skoro było więcej niż 3 ramki danych?
RPT

To jest niesamowite.
Odpowiem

3
Czy na pewno działa to dla dowolnego typu z plot(), mianowicie gdy każdy rodzaj specyfikacji są przekazywane jako argument do plotfunkcji?
gented

27

Jeśli masz uruchomiony notebook Jupyter / Ipython i masz problemy z używaniem;

ax = df1.plot()

df2.plot(ax=ax)

Uruchom polecenie w tej samej komórce !! Z jakiegoś powodu nie zadziała, gdy zostaną podzielone na kolejne komórki. Przynajmniej dla mnie.


6

Aby to zrobić dla wielu ramek danych, możesz wykonać na nich pętlę for:

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)

0

Aby wzmocnić odpowiedź @ adivis12, nie musisz robić tego ifoświadczenia. Ujmij to tak:

fig, ax = plt.subplots()
for BAR in dict_of_dfs.keys():
    dict_of_dfs[BAR].plot(ax=ax)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.