以下是我认为可行但没有成功的方法:
from matplotlib.ticker import FuncFormatter
from matplotlib import pyplot as plt
ax = data.A.plot()
ax.xaxis.set_major_formatter(FuncFormatter(lambda d, _: d.strftime('%a')))
或
ax = plt.subplot()
ax.plot(data.index, data.A)
ax.xaxis.set_major_formatter(FuncFormatter(lambda d, _: d.strftime('%a')))
这些都以不同的方式出错。在这两种情况下,格式化程序输入似乎都是 floats 而不是日期。首先,该函数仅应用于第一个和最后一个刻度。你可以通过传递看到这一点
ax.xaxis.set_major_formatter(FuncFormatter(lambda d, _: d)
这是一个非常灵活的解决方案:
ax = plt.subplot()
ax.plot(data.index, data.A)
ticks = ax.set_xticklabels([d.strftime('%a') for d in data.index])
您可以将最后一行的列表推导换成您喜欢的任何内容。
编辑:
我想我已经弄清楚这些代表xticks 的数字是什么意思了。
In [37]:
ax = plt.subplot()
ax.plot(data.index, data.A)
print ax.get_xticks()
[ 735824. 735825. 735826. 735827. 735828. 735829. 735830. 735831.
735832. 735833.]
这些似乎代表自公元 1 年开始以来的天数:据此:http://www.epochconverter.com/epoch/seconds-days-since-year-0.php
“从 0000-00-00 到今天(2015 年 8 月 14 日)之间有 736189 天。”
正好是 735824(第一个刻度)+ 365。到目前为止还很糟糕。
您可以(我不会打扰)编写一个函数来将此数字和类似的数字转换为日期。另一种方法是:
def get_day(tick):
date = dates[0] + datetime.timedelta(tick - ticks[0])
return date.strftime('%a')
ax = plt.subplot()
ax.plot(data.index, data.A)
ticks = ax.get_xticks()
ax.xaxis.set_major_formatter(FuncFormatter(lambda tick, _: get_day(tick)))
同样,您可以将所需的日期格式子转换为 get_day。不确定这是否会解决平移/缩放问题,但至少它提供了一种使用函数设置刻度标签的方法。