Делать горизонтальные линии с годовыми данными панд?

У меня есть объект панды с данными по среднегодовым значениям в этой форме:

DatetimeIndex(['2005-12-31', '2006-12-31', '2007-12-31', '2008-12-31',
               '2009-12-31', '2010-12-31', '2011-12-31'],
              dtype='datetime64[ns]', freq='A-DEC')
2005-12-31    3.347463
2006-12-31    3.042220
2007-12-31    3.296574
2008-12-31    3.082333
2009-12-31    2.471380
2010-12-31    2.337974
2011-12-31    2.083004

Я хотел бы нарисовать горизонтальные линии от начала года до конца года со значениями, связанными с последним днем ​​года. В настоящее время, когда я строю этот объект панд, я получаю линейную интерполяцию между точками в конце года. Я попытался добавить индексы с:

new_index= ['2005', '2006', '2007', '2008','2009', '2010', '2011']
df_year.reindex(new_index)

что приводит к тому же графику. Или добавление первого дня каждого года (хотя это не подходит для автоматизации) с помощью:

z=datetime.strptime('01-01-2005', '%d-%m-%Y')
indx.append(pd.Index([z]))
df_year.set_value(z,2)

в результате чего:

DatetimeIndex(['2005-12-31', '2006-12-31', '2007-12-31', '2008-12-31',
               '2009-12-31', '2010-12-31', '2011-12-31', '2005-01-01'],
              dtype='datetime64[ns]', freq=None)
2005-12-31    3.347463
2006-12-31    3.042220
2007-12-31    3.296574
2008-12-31    3.082333
2009-12-31    2.471380
2010-12-31    2.337974
2011-12-31    2.083004
2005-01-01    2.000000

Однако, похоже, что он не может определить, что эта дата раньше 2005-12-31, поэтому просто нарисуйте горизонтальную линию с 2005 по 2011 год. Я был бы очень признателен, если бы вы могли мне помочь.

К сожалению, я не могу загрузить графики, так как я работаю на другом сервере и не могу сохранить изображения.

Спасибо.

Издание:

Вот код, который я использовал:

plt.figure()
plt.plot(df_month.index,  df_month, 'k')
plt.plot(df_year.index,  df_year, 'g')
plt.show()

1 ответ

Решение

Если я правильно понял, вы хотите гистограмму или шаги, такие как plit, для ваших значений, используя даты в качестве оси x.

DataFrame

Если мы установим DataFrameследующее:

import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame([["2005-12-31", 3.347463],["2006-12-31", 3.042220],["2007-12-31", 3.296574],["2008-12-31", 3.082333],["2009-12-31", 2.471380],["2010-12-31", 2.337974],["2011-12-31", 2.083004]])
df.columns = ["date", "value"]
df["date"] = pd.to_datetime(df["date"], format="%Y-%m-%d")
df = df.set_index(["date"])

Ваш DataFrame было бы:

>>> df
               value
date                
2005-12-31  3.347463
2006-12-31  3.042220
2007-12-31  3.296574
2008-12-31  3.082333
2009-12-31  2.471380
2010-12-31  2.337974
2011-12-31  2.083004

Обратите внимание, что мы устанавливаем date столбец как индекс.

Использование plot.bar

Ты можешь использовать plot.bar функция. Если это не доступно из-за pandas версию вы можете попробовать plot(kind="bar") вместо. Ниже код будет строить и показывать желаемый график:

df.plot.bar(width=1,fill=False)
plt.tight_layout()
plt.show()

И выходной граф приведет к: Бар Участок

Обратите внимание, что с помощью width как 1 мы получаем бары с полной шириной. width по умолчанию 0,5.

Использование сюжета со ступеньками в середине как linetyle

В противном случае вы можете использовать plot с steps-mid как линейный стиль с кодом ниже:

df.plot(ls="steps-mid")
plt.show()

Вы получаете в виде графика: Участок с шагами

Другие вопросы по тегам