matplotlib 中的 DateLocator 显示一周和一个月的第一天
DateLocator in matplotlib to show the first days of both the week and the month
我想在 matplotlib 中创建一个 DateLocator,它选择所有星期一 和 该月的第一天。由于 matplotlib 使用 dateutil 中的 dateutil library I read the docs of how to use RRuleLocator
with rrule
objects. With the rruleset 对象,我可以实现所需的功能:
>>> rrset = rruleset()
>>> rrset.rrule(rrule(DAILY, byweekday=MO, count=5))
>>> rrset.rrule(rrule(DAILY, bymonthday=1, count=5))
>>> list(rrset)
[datetime.datetime(2020, 11, 30, 16, 10, 2),
datetime.datetime(2020, 12, 1, 16, 10, 2),
datetime.datetime(2020, 12, 7, 16, 10, 2),
datetime.datetime(2020, 12, 14, 16, 10, 2),
datetime.datetime(2020, 12, 21, 16, 10, 2),
datetime.datetime(2020, 12, 28, 16, 10, 2),
datetime.datetime(2021, 1, 1, 16, 10, 2),
datetime.datetime(2021, 2, 1, 16, 10, 2),
datetime.datetime(2021, 3, 1, 16, 10, 2),
datetime.datetime(2021, 4, 1, 16, 10, 2)]
但不幸的是,我没有找到如何将 rruleset 与 matplotlib 一起使用的方法。 RRuleLocator
需要一个隐藏 rrule 实例的 rrulewrapper 对象(在 matplotlib 中定义),我不能将它与 rruleset 一起使用。还有其他方法吗?
如果我没理解错的话,调用 .set_xticks(list(rrset))
可能就足够了。例如:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import dateutil
from dateutil.rrule import *
import datetime
import numpy as np
rrset = rruleset()
rrset.rrule(rrule(DAILY, byweekday=MO, count=5))
rrset.rrule(rrule(DAILY, bymonthday=1, count=5))
print(list(rrset))
## generate dates 90 days into the future
base = datetime.datetime.today()
dates = [base + datetime.timedelta(days=3*x) for x in range(30)]
fig = plt.figure(figsize=(10,5))
ax = plt.subplot(111)
ax.set_autoscale_on(True)
## simply plot dates over dates
ax.plot(dates,dates,marker='s')
ax.set_xticks(list(rrset))
formatter = mdates.DateFormatter('%m/%d/%y')
ax.xaxis.set_major_formatter(formatter)
ax.xaxis.set_tick_params(rotation=30, labelsize=10)
ax.autoscale_view()
ax.grid()
plt.show()
收益率(今天是 2020 年 11 月 26 日,下周一是 2020 年 11 月 30 日,因此刻度标签与本月的第一天重叠):
我想在 matplotlib 中创建一个 DateLocator,它选择所有星期一 和 该月的第一天。由于 matplotlib 使用 dateutil 中的 dateutil library I read the docs of how to use RRuleLocator
with rrule
objects. With the rruleset 对象,我可以实现所需的功能:
>>> rrset = rruleset()
>>> rrset.rrule(rrule(DAILY, byweekday=MO, count=5))
>>> rrset.rrule(rrule(DAILY, bymonthday=1, count=5))
>>> list(rrset)
[datetime.datetime(2020, 11, 30, 16, 10, 2),
datetime.datetime(2020, 12, 1, 16, 10, 2),
datetime.datetime(2020, 12, 7, 16, 10, 2),
datetime.datetime(2020, 12, 14, 16, 10, 2),
datetime.datetime(2020, 12, 21, 16, 10, 2),
datetime.datetime(2020, 12, 28, 16, 10, 2),
datetime.datetime(2021, 1, 1, 16, 10, 2),
datetime.datetime(2021, 2, 1, 16, 10, 2),
datetime.datetime(2021, 3, 1, 16, 10, 2),
datetime.datetime(2021, 4, 1, 16, 10, 2)]
但不幸的是,我没有找到如何将 rruleset 与 matplotlib 一起使用的方法。 RRuleLocator
需要一个隐藏 rrule 实例的 rrulewrapper 对象(在 matplotlib 中定义),我不能将它与 rruleset 一起使用。还有其他方法吗?
如果我没理解错的话,调用 .set_xticks(list(rrset))
可能就足够了。例如:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import dateutil
from dateutil.rrule import *
import datetime
import numpy as np
rrset = rruleset()
rrset.rrule(rrule(DAILY, byweekday=MO, count=5))
rrset.rrule(rrule(DAILY, bymonthday=1, count=5))
print(list(rrset))
## generate dates 90 days into the future
base = datetime.datetime.today()
dates = [base + datetime.timedelta(days=3*x) for x in range(30)]
fig = plt.figure(figsize=(10,5))
ax = plt.subplot(111)
ax.set_autoscale_on(True)
## simply plot dates over dates
ax.plot(dates,dates,marker='s')
ax.set_xticks(list(rrset))
formatter = mdates.DateFormatter('%m/%d/%y')
ax.xaxis.set_major_formatter(formatter)
ax.xaxis.set_tick_params(rotation=30, labelsize=10)
ax.autoscale_view()
ax.grid()
plt.show()
收益率(今天是 2020 年 11 月 26 日,下周一是 2020 年 11 月 30 日,因此刻度标签与本月的第一天重叠):