मैं matplotlib में डेटलोकेटर बनाना चाहता हूं जो महीने के पहले दिनों में सभी सोमवार और का चयन करता है। चूंकि matplotlib dateutil लाइब्रेरी का उपयोग करता है, मैंने RRuleLocator को <कोड> के साथ उपयोग करने के डॉक्स को पढ़ा। कोड>नियम ऑब्जेक्ट। dateutil से rulset ऑब्जेक्ट के साथ मैं आवश्यक कार्यक्षमता प्राप्त कर सकता हूं :

>>> 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)]

लेकिन दुर्भाग्य से मैंने यह पता लगाने का प्रबंधन नहीं किया कि matplotlib के साथ रूलसेट का उपयोग कैसे करें। RRuleLocator एक rrulewrapper ऑब्जेक्ट (matplotlib में परिभाषित) की अपेक्षा करता है जो rrule उदाहरण को छुपाता है और मैं इसे rruleset के साथ उपयोग नहीं कर सकता। ऐसा करने का कोई और तरीका?

0
MrTJ 25 नवम्बर 2020, 18:12

1 उत्तर

सबसे बढ़िया उत्तर

अगर मैं आपको सही ढंग से समझ पाया, तो .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()

पैदावार (आज ११/२६/२० को जहां ११/३०/२०२० अगला सोमवार है, इसलिए महीने के पहले के साथ टिक लेबल ओवरलैपिंग):

plotting with a custom date formatter

1
Asmus 26 नवम्बर 2020, 13:05