Вот что я думал, что будет работать, но не сделал:
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])
Вы можете поменять список понимание в последней строке для все, что вы хотели.
EDIT:
Я думаю, что я понять, что эти цифры, представляющие 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.]
Они, кажется, представляют собой количество дней, прошедших с начала AD 1: В соответствии с этим: http://www.epochconverter.com/epoch/seconds-days-since-year-0.php
«Есть 736189 дней между 0000-00-00 и сегодня (14 августа 2015) «.
Это точно 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
. Не уверен, что это решит проблему панорамирования/масштабирования, но, по крайней мере, дает возможность установить метки меток с помощью функции.
Кажется, что 'date.weekday' должен каким-то образом помочь? – tom