僕が以前作ったプログラム(の抜粋)です。
- xが日曜日の場合x軸を描画
- 初めと終わりの日時の間隔に応じて表示するx軸を変える。月間隔<6なら1週間隔、月間隔<12なら2週間隔、月間隔<18なら3週間隔というように。
- 日付はローテーション(表示角度の変更)しています。
今回の場合は、get_my_xticks()を質問者さんの望むように変更すればよいと思われます。
参考になれば。
python
1from datetime import datetime, timedelta
2from math import sin
3import matplotlib.pyplot as plt
4from matplotlib.dates import date2num
5import matplotlib.ticker as ticker
6from matplotlib.dates import DateFormatter
7from monthdelta import monthmod
8import japanize_matplotlib
9
10
11def get_first_sunday(timestamp_list):
12 for d in timestamp_list:
13 if d.weekday() == 6:
14 return d
15 return None
16
17
18# X軸のticks(目盛り.tickの意味はダニ)作成
19def get_my_xticks(timestamp_list):
20 my_xticks = []
21
22 # 最初の日曜日がない時
23 first_sunday = get_first_sunday(timestamp_list)
24 if first_sunday is None:
25 my_xticks.append(timestamp_list[0])
26 return my_xticks
27
28 # X軸のticks 作成
29 date_last = timestamp_list[-1]
30 date_val = first_sunday
31 my_xticks.append(date_val)
32 months = monthmod(timestamp_list[0], timestamp_list[-1])[0].months
33
34 # xtick間隔:月間隔<6⇒1週間隔、月間隔<12⇒2週間隔、月間隔<18⇒3週間隔・・・
35 days_interval = ((months // 6) + 1) * 7
36 while date_val + timedelta(days=days_interval) <= date_last:
37 date_val += timedelta(days=days_interval)
38 my_xticks.append(date_val)
39
40 return my_xticks
41
42
43def main():
44 font_size = plt.rcParams["font.size"]
45
46 x = [datetime(2021, 1, 1) + timedelta(days=i) for i in range(365)]
47 y = [sin(i) for i in range(365)]
48
49 fig = plt.figure()
50 plt.subplots_adjust(bottom=0.2)
51 ax = fig.add_subplot()
52 ax.plot(x, y)
53 ax.set_xlabel('日付(年は西暦の下二桁)')
54
55 # x軸の目盛り
56 xaxis = ax.xaxis
57 xticks_list = get_my_xticks(list(x))
58 xticks = date2num(xticks_list)
59 xaxis.set_major_locator(ticker.FixedLocator(xticks))
60 xaxis.set_major_formatter(DateFormatter('%y-%m-%d'))
61 ax.tick_params(axis='x', labelsize=font_size * 0.9, labelrotation=315)
62 plt.show()
63
64
65if __name__ == '__main__':
66 main()
67
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/22 05:35