不以均匀间隔绘制连续天数

Plot no consecutive days with even intervals

我正在使用以下函数绘制图表,显示 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 可能 return

[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)]

这是结果图:

如何在 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
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()

这里你真正需要的是用 pivot 重塑 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()

除了使用 DateFormatter(就像你已经做的那样),我建议使用 DateLocator(在你的情况下 YearLocator 有意义)来定位刻度(而不是使用 [=11 手动定位它们=]):

ax.xaxis.set_major_locator(YearLocator())