2

我正在使用 matplotlib 绘制一些财务数据。但是,在其默认配置中,matplotlib 会插入空白来代替丢失的数据。该文档建议使用日期索引格式化程序来解决此问题。

但是,可以在页面上提供的示例中看到:

  • 格式已从“2008 年 9 月 3 日”=>“2008-09-03”更改
  • 图表不再以最终样本结束,而是填充到“2008-10-14”。

如何在保留此默认行为的同时仍避免数据中的空白?

编辑

来自文档的示例代码,顶部带有所需的刻度。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import matplotlib.cbook as cbook
import matplotlib.ticker as ticker

datafile = cbook.get_sample_data('aapl.csv', asfileobj=False)
print 'loading', datafile
r = mlab.csv2rec(datafile)

r.sort()
r = r[-30:]  # get the last 30 days


# first we'll do it the default way, with gaps on weekends
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(r.date, r.adj_close, 'o-')
fig.autofmt_xdate()

# next we'll write a custom formatter
N = len(r)
ind = np.arange(N)  # the evenly spaced plot indices

def format_date(x, pos=None):
    thisind = np.clip(int(x+0.5), 0, N-1)
    return r.date[thisind].strftime('%Y-%m-%d')

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(ind, r.adj_close, 'o-')
ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
fig.autofmt_xdate()

plt.show()
4

1 回答 1

1

好吧,我将回答简单的部分:获取Sept 03 2008而不是2008-09-03使用strftime('%b %d %Y')

def format_date(x, pos=None):
    thisind = np.clip(int(x+0.5), 0, N-1)
    result = r.date[thisind].strftime('%b %d %Y')
    return result

PS。中的最后一个日期r.dateOct 14 2008,所以我认为为其添加一个刻度线并不是一件坏事。你确定你不想要吗?

于 2012-08-06T20:45:27.217 回答