用熊猫年度数据制作水平线?

时间:2017-11-07 10:29:52

标签: python pandas date horizontal-line

我有一个pandas对象,其中包含此格式的年平均数据:

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

我想从年初到年底绘制水平线,其中当前值与当年的最后一天相关联。目前,当我绘制这个pandas对象时,我得到了年末点之间的线性插值。我尝试添加索引:

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 个答案:

答案 0 :(得分:0)

如果我理解正确你需要一个条形图或像plit这样的步骤,使用日期作为x轴。

数据帧

如果我们按如下方式设置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()

输出图将导致: Bar Plot

请注意,使用width作为1,我们得到整条宽度的条形图。默认情况下,width为0.5。

使用带有step-mid作为linetyle的绘图

否则,您可以将plotsteps-mid一起用作linestyle,代码如下:

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

你得到图: Plot with steps