我使用以下功能绘制显示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)]
这是结果图:
如何在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
答案 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()
你真正需要用枢轴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()
答案 1 :(得分:0)
除了使用DateFormatter(就像你已经做过的那样),我建议使用DateLocator(在你的情况下是一个有意义的YearLocator)来定位刻度(而不是用ax.xaxis.set_ticks
手动定位它们。 ):
ax.xaxis.set_major_locator(YearLocator())