matplotlib中的DateLocator,显示一周和一个月的前几天

2024-09-22 14:38:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在matplotlib中创建一个DateLocator,它选择每个月的所有周一头几天。由于matplotlib使用了dateutil库,我阅读了关于如何将RRuleLocatorrrule对象一起使用的文档。使用dateutil中的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需要一个RruleRapper对象(在matplotlib中定义),该对象隐藏了rrule实例,我无法将其用于rruleset。还有别的办法吗


Tags: 对象文档功能datetimematplotlibcountdailymo
1条回答
网友
1楼 · 发布于 2024-09-22 14:38:03

如果我理解正确,打电话给.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()

收益率(今天是20年11月26日,其中2020年11月30日是下周一,因此勾号标签与本月1日重叠):

plotting with a custom date formatter

相关问题 更多 >