我正在策划一个金融时间表(见下文,这里有1个月的数据)
我想删除我用红十字等表示的时段,这是星期六。请注意,这些时段并非所有没有数据的时段,而只是星期六。
我知道有一些如何消除差距的例子,例如:http://matplotlib.org/examples/api/date_index_formatter.html。 这不是我所追求的,因为它们消除了所有的空白。 (不是我的意图!)。
我认为要走的路可能是为xaxis创建自定义值序列。由于日期是序数(即1天=值1),因此可能会创建一个序列,如1,2,3,4,5,6,8,9,10,11,12,13, 15,16等。每七天跳一次 - 当天跳过需要成为星期六。
每周六跳过我可以想象如何使用来自timeutil的rrule来做到这一点。这是在这里完成的(见下文),因为每个星期一都标有更强的垂直线。但是我如何将它传递给Tick定位器?实际上matplotlib API中有一个RRuleLocator类,但在doc:http://matplotlib.org/api/dates_api.html#matplotlib.dates.RRuleLocator中没有给出如何使用它的说明。 每个建议都欢迎。
这里是我用于当前图表的代码:
fig, axes = plt.subplots(2, figsize=(20, 6))
quotes = price_data.as_matrix() # as matrix() to remove the columns header of the df
mpf.candlestick_ohlc(axes[0], quotes, width=0.01)
plt.bar(quotes[:,0] , quotes[:,5], width = 0.01)
for i , axes[i] in enumerate(axes):
axes[i].xaxis.set_major_locator(mdates.DayLocator(interval=1) )
axes[i].xaxis.set_major_formatter(mdates.DateFormatter('%a, %b %d'))
axes[i].grid(True)
# show night times with a grey shade
majors=axes[i].xaxis.get_majorticklocs()
chart_start, chart_end = (axes[i].xaxis.get_view_interval()[0],
axes[i].xaxis.get_view_interval()[1])
for major in majors:
axes[i].axvspan(max (chart_start, major-(0.3333)),
min(chart_end, major+(0.3333)),color="0.95", zorder=-1 ) #0.33 corresponds to 1/3 of a day i.e. 8h
# show mondays with a line
mondays = list(rrule(WEEKLY, byweekday=MO, dtstart= mdates.num2date(chart_start),
until=mdates.num2date(chart_end)))
for j, monday in enumerate(mondays):
axes[i].axvline(mdates.date2num(mondays[j]), linewidth=0.75, color='k', zorder=1)