以偶数间隔绘制连续天数

时间:2015-04-27 00:29:14

标签: python pandas matplotlib

我使用以下功能绘制显示6年每年2个月数字的图表

def plot_report(property_type, first_period, year_periods, month_periods):
    reporting_periods = get_reporting_periods(first_period, year_periods, month_periods)
    data = get_rows(df, property_type, reporting_periods)
    suburbs = data.groupby(['state', 'suburb'])

    fig, ax = plt.subplots()

    for i, suburb in suburbs:
        suburb.plot(x='yrend', y='median_price', ax=ax, linewidth=2)

    ax.xaxis.set_ticks(reporting_periods)
    ax.xaxis.set_major_formatter(DateFormatter("%b %y"))
    ax.yaxis.set_major_formatter(formatter)

    ax.grid(False)
    ax.legend().set_visible(False)
    fig.autofmt_xdate()

    locs, labels = plt.xticks()
    plt.setp(labels, rotation=90)

    return plt.show()

reporting_periods 可能会返回

[datetime.datetime(2004, 12, 1, 0, 0), datetime.datetime(2005, 1, 1, 0, 0), datetime.datetime(2003, 12, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0), datetime.datetime(2002, 12, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0), datetime.datetime(2001, 12, 1, 0, 0), datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2000, 12, 1, 0, 0), datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(1999, 12, 1, 0, 0), datetime.datetime(2000, 1, 1, 0, 0)]

这是结果图: enter image description here

如何在x轴上均匀分配日期 - 间隔相同?

一些示例数据:

suburb  state   house   yrend   median_price
CHARNWOOD   ACT H   31/01/91 0:00   91000
CHARNWOOD   ACT H   28/02/91 0:00   90000
CHARNWOOD   ACT H   31/03/91 0:00   92000
CHARNWOOD   ACT H   30/04/91 0:00   92000
CHARNWOOD   ACT H   31/05/91 0:00   92400
CHARNWOOD   ACT H   30/06/91 0:00   94000
CHARNWOOD   ACT H   31/07/91 0:00   95000
CHARNWOOD   ACT H   31/08/91 0:00   95000
CHARNWOOD   ACT H   30/09/91 0:00   96000
CHARNWOOD   ACT H   31/10/91 0:00   97100
CHARNWOOD   ACT H   30/11/91 0:00   98000
CHARNWOOD   ACT H   31/12/91 0:00   98000
CHARNWOOD   ACT H   31/01/92 0:00   103000
CHARNWOOD   ACT H   29/02/92 0:00   105000
CHARNWOOD   ACT H   31/03/92 0:00   106000
CHARNWOOD   ACT H   30/04/92 0:00   109000
CHARNWOOD   ACT H   31/05/92 0:00   110000
CHARNWOOD   ACT H   30/06/92 0:00   113975
CHARNWOOD   ACT H   31/07/92 0:00   117000
CHARNWOOD   ACT H   31/08/92 0:00   118000
CHARNWOOD   ACT H   30/09/92 0:00   119725
CHARNWOOD   ACT H   31/10/92 0:00   120000
CHARNWOOD   ACT H   30/11/92 0:00   123250
CHARNWOOD   ACT H   31/12/92 0:00   123250
CHARNWOOD   ACT H   31/01/93 0:00   123500
CHARNWOOD   ACT H   28/02/93 0:00   123500
CHARNWOOD   ACT H   31/03/93 0:00   123500
CHARNWOOD   ACT H   30/04/93 0:00   125000
CHARNWOOD   ACT H   31/05/93 0:00   123500
CHARNWOOD   ACT H   30/06/93 0:00   123000
CHARNWOOD   ACT H   31/07/93 0:00   120000
CHARNWOOD   ACT H   31/08/93 0:00   120000
CHARNWOOD   ACT H   30/09/93 0:00   120000
CHARNWOOD   ACT H   31/10/93 0:00   120000
CHARNWOOD   ACT H   30/11/93 0:00   118500
CHARNWOOD   ACT H   31/12/93 0:00   118500
CHARNWOOD   ACT H   31/01/94 0:00   118200
CHARNWOOD   ACT H   28/02/94 0:00   119000
CHARNWOOD   ACT H   31/03/94 0:00   118500
CHARNWOOD   ACT H   30/04/94 0:00   118500
CHARNWOOD   ACT H   31/05/94 0:00   118200
CHARNWOOD   ACT H   30/06/94 0:00   119500
CHARNWOOD   ACT H   31/07/94 0:00   119500
CHARNWOOD   ACT H   31/08/94 0:00   119500
CHARNWOOD   ACT H   30/09/94 0:00   118850
CHARNWOOD   ACT H   31/10/94 0:00   119500
CHARNWOOD   ACT H   30/11/94 0:00   116500
CHARNWOOD   ACT H   31/12/94 0:00   116000
CHARNWOOD   ACT H   31/01/95 0:00   115000
CHARNWOOD   ACT H   28/02/95 0:00   112250
CHARNWOOD   ACT H   31/03/95 0:00   110000
CHARNWOOD   ACT H   30/04/95 0:00   110000
CHARNWOOD   ACT H   31/05/95 0:00   109975
CHARNWOOD   ACT H   30/06/95 0:00   106000
CHARNWOOD   ACT H   31/07/95 0:00   106000
CHARNWOOD   ACT H   31/08/95 0:00   106000
CHARNWOOD   ACT H   30/09/95 0:00   104000
CHARNWOOD   ACT H   31/10/95 0:00   103500
CHARNWOOD   ACT H   30/11/95 0:00   101000
CHARNWOOD   ACT H   31/12/95 0:00   101750
CHARNWOOD   ACT H   31/01/96 0:00   102750
CHARNWOOD   ACT H   29/02/96 0:00   103000
CHARNWOOD   ACT H   31/03/96 0:00   100500
CHARNWOOD   ACT H   30/04/96 0:00   100000
CHARNWOOD   ACT H   31/05/96 0:00   99500
CHARNWOOD   ACT H   30/06/96 0:00   98750
CHARNWOOD   ACT H   31/07/96 0:00   96000
CHARNWOOD   ACT H   31/08/96 0:00   97000
CHARNWOOD   ACT H   30/09/96 0:00   98750
CHARNWOOD   ACT H   31/10/96 0:00   98750
CHARNWOOD   ACT H   30/11/96 0:00   100000
CHARNWOOD   ACT H   31/12/96 0:00   98000
BELCONNEN   ACT H   31/01/91 0:00   381000
BELCONNEN   ACT H   28/02/91 0:00   382325
BELCONNEN   ACT H   31/03/91 0:00   382000
BELCONNEN   ACT H   30/04/91 0:00   385000
BELCONNEN   ACT H   31/05/91 0:00   382650
BELCONNEN   ACT H   30/06/91 0:00   381325
BELCONNEN   ACT H   31/07/91 0:00   389000
BELCONNEN   ACT H   31/08/91 0:00   388500
BELCONNEN   ACT H   30/09/91 0:00   383825
BELCONNEN   ACT H   31/10/91 0:00   381325
BELCONNEN   ACT H   30/11/91 0:00   379000
BELCONNEN   ACT H   31/12/91 0:00   374500
BELCONNEN   ACT H   31/01/92 0:00   371000
BELCONNEN   ACT H   29/02/92 0:00   371000
BELCONNEN   ACT H   31/03/92 0:00   370700
BELCONNEN   ACT H   30/04/92 0:00   370000
BELCONNEN   ACT H   31/05/92 0:00   370200
BELCONNEN   ACT H   30/06/92 0:00   370000
BELCONNEN   ACT H   31/07/92 0:00   365000
BELCONNEN   ACT H   31/08/92 0:00   370000
BELCONNEN   ACT H   30/09/92 0:00   373750
BELCONNEN   ACT H   31/10/92 0:00   375000
BELCONNEN   ACT H   30/11/92 0:00   380000
BELCONNEN   ACT H   31/12/92 0:00   381000
BELCONNEN   ACT H   31/01/93 0:00   388000
BELCONNEN   ACT H   28/02/93 0:00   384000
BELCONNEN   ACT H   31/03/93 0:00   389000
BELCONNEN   ACT H   30/04/93 0:00   395000
BELCONNEN   ACT H   31/05/93 0:00   397500
BELCONNEN   ACT H   30/06/93 0:00   400000
BELCONNEN   ACT H   31/07/93 0:00   400000
BELCONNEN   ACT H   31/08/93 0:00   397500
BELCONNEN   ACT H   30/09/93 0:00   400800
BELCONNEN   ACT H   31/10/93 0:00   405000
BELCONNEN   ACT H   30/11/93 0:00   406500
BELCONNEN   ACT H   31/12/93 0:00   122500
BELCONNEN   ACT H   31/01/94 0:00   122000
BELCONNEN   ACT H   28/02/94 0:00   125000
BELCONNEN   ACT H   31/03/94 0:00   125000
BELCONNEN   ACT H   30/04/94 0:00   125000
BELCONNEN   ACT H   31/05/94 0:00   126750
BELCONNEN   ACT H   30/06/94 0:00   129975
BELCONNEN   ACT H   31/07/94 0:00   133725
BELCONNEN   ACT H   31/08/94 0:00   137000
BELCONNEN   ACT H   30/09/94 0:00   140000
BELCONNEN   ACT H   31/10/94 0:00   142750
BELCONNEN   ACT H   30/11/94 0:00   142750
BELCONNEN   ACT H   31/12/94 0:00   149000
BELCONNEN   ACT H   31/01/95 0:00   157000
BELCONNEN   ACT H   28/02/95 0:00   160000
BELCONNEN   ACT H   31/03/95 0:00   161875
BELCONNEN   ACT H   30/04/95 0:00   165000
BELCONNEN   ACT H   31/05/95 0:00   165000
BELCONNEN   ACT H   30/06/95 0:00   171500
BELCONNEN   ACT H   31/07/95 0:00   179000
BELCONNEN   ACT H   31/08/95 0:00   185000
BELCONNEN   ACT H   30/09/95 0:00   189950
BELCONNEN   ACT H   31/10/95 0:00   195000
BELCONNEN   ACT H   30/11/95 0:00   195500
BELCONNEN   ACT H   31/12/95 0:00   198000
BELCONNEN   ACT H   31/01/96 0:00   206000
BELCONNEN   ACT H   29/02/96 0:00   210000
BELCONNEN   ACT H   31/03/96 0:00   211500
BELCONNEN   ACT H   30/04/96 0:00   219000
BELCONNEN   ACT H   31/05/96 0:00   225000
BELCONNEN   ACT H   30/06/96 0:00   234000
BELCONNEN   ACT H   31/07/96 0:00   245000
BELCONNEN   ACT H   31/08/96 0:00   245500
BELCONNEN   ACT H   30/09/96 0:00   247000
BELCONNEN   ACT H   31/10/96 0:00   248000
BELCONNEN   ACT H   30/11/96 0:00   249500
BELCONNEN   ACT H   31/12/96 0:00   248000
BRUCE   ACT H   31/01/91 0:00   405900
BRUCE   ACT H   28/02/91 0:00   405900
BRUCE   ACT H   31/03/91 0:00   405900
BRUCE   ACT H   30/04/91 0:00   405900
BRUCE   ACT H   31/05/91 0:00   405900
BRUCE   ACT H   30/06/91 0:00   405900
BRUCE   ACT H   31/07/91 0:00   405900
BRUCE   ACT H   31/08/91 0:00   405900
BRUCE   ACT H   30/09/91 0:00   405900
BRUCE   ACT H   31/10/91 0:00   405900
BRUCE   ACT H   30/11/91 0:00   405900
BRUCE   ACT H   31/12/91 0:00   405900
BRUCE   ACT H   31/01/92 0:00   405900
BRUCE   ACT H   29/02/92 0:00   405900
BRUCE   ACT H   31/03/92 0:00   405900
BRUCE   ACT H   30/04/92 0:00   405900
BRUCE   ACT H   31/05/92 0:00   405900
BRUCE   ACT H   30/06/92 0:00   405900
BRUCE   ACT H   31/07/92 0:00   405900
BRUCE   ACT H   31/08/92 0:00   405900
BRUCE   ACT H   30/09/92 0:00   405900
BRUCE   ACT H   31/10/92 0:00   405900
BRUCE   ACT H   30/11/92 0:00   405900
BRUCE   ACT H   31/12/92 0:00   405900
BRUCE   ACT H   31/01/93 0:00   405900
BRUCE   ACT H   28/02/93 0:00   405900
BRUCE   ACT H   31/03/93 0:00   405900
BRUCE   ACT H   30/04/93 0:00   405900
BRUCE   ACT H   31/05/93 0:00   405900
BRUCE   ACT H   30/06/93 0:00   405900
BRUCE   ACT H   31/07/93 0:00   405900
BRUCE   ACT H   31/08/93 0:00   405900
BRUCE   ACT H   30/09/93 0:00   405900
BRUCE   ACT H   31/10/93 0:00   405900
BRUCE   ACT H   30/11/93 0:00   405900
BRUCE   ACT H   31/12/93 0:00   405900
BRUCE   ACT H   31/01/94 0:00   405900
BRUCE   ACT H   28/02/94 0:00   405900
BRUCE   ACT H   31/03/94 0:00   405900
BRUCE   ACT H   30/04/94 0:00   339000
BRUCE   ACT H   31/05/94 0:00   360000
BRUCE   ACT H   30/06/94 0:00   377500
BRUCE   ACT H   31/07/94 0:00   377500
BRUCE   ACT H   31/08/94 0:00   377500
BRUCE   ACT H   30/09/94 0:00   377500
BRUCE   ACT H   31/10/94 0:00   360000
BRUCE   ACT H   30/11/94 0:00   351000
BRUCE   ACT H   31/12/94 0:00   351000
BRUCE   ACT H   31/01/95 0:00   351000
BRUCE   ACT H   28/02/95 0:00   351000
BRUCE   ACT H   31/03/95 0:00   351000
BRUCE   ACT H   30/04/95 0:00   351000
BRUCE   ACT H   31/05/95 0:00   351000
BRUCE   ACT H   30/06/95 0:00   351000
BRUCE   ACT H   31/07/95 0:00   351000
BRUCE   ACT H   31/08/95 0:00   351000
BRUCE   ACT H   30/09/95 0:00   351000
BRUCE   ACT H   31/10/95 0:00   351000
BRUCE   ACT H   30/11/95 0:00   351000
BRUCE   ACT H   31/12/95 0:00   351000
BRUCE   ACT H   31/01/96 0:00   351000
BRUCE   ACT H   29/02/96 0:00   351000
BRUCE   ACT H   31/03/96 0:00   351000
BRUCE   ACT H   30/04/96 0:00   351000
BRUCE   ACT H   31/05/96 0:00   351000
BRUCE   ACT H   30/06/96 0:00   351000
BRUCE   ACT H   31/07/96 0:00   351000
BRUCE   ACT H   31/08/96 0:00   302750
BRUCE   ACT H   30/09/96 0:00   307750
BRUCE   ACT H   31/10/96 0:00   312000
BRUCE   ACT H   30/11/96 0:00   312000

2 个答案:

答案 0 :(得分:1)

import pandas as pd
from StringIO import StringIO

table = """suburb  state   house   yrend   median_price
CHARNWOOD   ACT H   31/01/91 0:00   91000
CHARNWOOD   ACT H   28/02/91 0:00   90000
...
BRUCE   ACT H   30/11/96 0:00   312000
"""

table = table.replace("0:00", "")
sio = StringIO(table)
df = pd.read_table(sio, sep=r"\s+", parse_dates=['yrend'])
df = df.pivot(index="yrend", columns="suburb", values="median_price")
df.plot()

enter image description here

你真正需要用枢轴http://pandas.pydata.org/pandas-docs/stable/reshaping.html重新塑造你。

编辑:调整格式化程序,可能不完全符合您的需求,但您明白了。对于如此精细的研磨定制,你必须求助于matplotlib ...

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
import matplotlib.dates as dates
from matplotlib.ticker import FuncFormatter, NullFormatter
import pylab

from StringIO import StringIO

table = table.replace("0:00", "")
sio = StringIO(table)
df = pd.read_table(sio, sep=r"\s+", parse_dates=['yrend'])
df = df.pivot_table(index=["yrend"], columns=["state","suburb"], values=["median_price"])

fig, ax = plt.subplots()

# plot the lines
for col in df.columns:
    ax.plot(df.index, df[col])

# tune the tickers 
locator  = dates.MonthLocator(range(1, 13), bymonthday=1, interval=6)
ax.xaxis.set_minor_locator(locator)
def _monthFmt(x, pos):
    dt = pylab.num2date(x)
    return dt.strftime('%Y') if dt.month == 2 else dt.strftime("%b")
formatter = FuncFormatter(_monthFmt)
ax.xaxis.set_minor_formatter(formatter)
# quiet major formatter - default the years
ax.xaxis.set_major_formatter(NullFormatter())
ax.xaxis.grid(True, which="minor")

ax.yaxis.grid()

plt.show()

enter image description here

答案 1 :(得分:0)

除了使用DateFormatter(就像你已经做过的那样),我建议使用DateLocator(在你的情况下是一个有意义的YearLocator)来定位刻度(而不是用ax.xaxis.set_ticks手动定位它们。 ):

ax.xaxis.set_major_locator(YearLocator())