Постройте разные DataFrames на одном рисунке

93

У меня есть файл температуры с многолетними записями температуры в следующем формате:

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

Каждый год имеет разные числа, время записи, поэтому pandas datetimeindices все разные.

Я хочу изобразить данные за разные годы на одном и том же рисунке для сравнения. Ось X - это январь – декабрь, ось Y - температура. Как мне это сделать?

Wuwucat
источник

Ответы:

30

Хотя ответ Чанга объясняет, как построить несколько раз на одной фигуре, в этом случае вам может быть лучше в этом случае использовать a groupbyи unstacking:

(Предполагая, что у вас есть это в кадре данных, уже с индексом 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

Теперь легко построить график (каждый год отдельной строкой):

df.groupby(['Month','Year']).mean().unstack().plot()
Энди Хайден
источник
345

Пытаться:

ax = df1.plot()
df2.plot(ax=ax)
Чанг Ше
источник
1
если это на ноутбуке ipython, как этого добиться? есть ли функция удержания или отображения, которая печатает график только после того, как все настройки установлены?
Diansheng
1
Задайте место %matplotlib inlineдля импорта, чтобы визуализации отображались внутри записных книжек iPython.
Hassan
1
Любая подсказка, как это будет работать, если было более 3 фреймов данных?
RPT
Это потрясающе. Я отвечу, как делать с более чем 3
dfs
3
Вы уверены , что это работает для любого типа из plot(), а именно , когда любой тип спецификации передаются в качестве аргумента в plotфункции?
Создан
27

Если у вас работает ноутбук Jupyter / Ipython и возникают проблемы с использованием;

ax = df1.plot()

df2.plot(ax=ax)

Выполните команду внутри той же ячейки !! Когда они разделены на последовательные ячейки, почему-то не сработает. По крайней мере, для меня.

Хэмиш Робертсон
источник
6

Чтобы сделать это для нескольких фреймов данных, вы можете выполнить цикл 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)
adivis12
источник
0

Просто чтобы улучшить ответ @ adivis12, вам не нужно делать ifзаявление. Скажем так:

fig, ax = plt.subplots()
for BAR in dict_of_dfs.keys():
    dict_of_dfs[BAR].plot(ax=ax)
консе
источник