質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1967閲覧

グラフの横軸ラベルの日付を指定して表示させたい

taihei_._

総合スコア15

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/21 07:13

前提・実現したいこと

縦軸(twinx)に波高と周期、横軸に1-31日の一か月分の日付を取り、12か月分(12個)のグラフを並べています。並べる際、日付ラベルが多いと見づらくなってしまうので、各月1日、15日、30日(2月は28日)のみを表示させたいです。

発生している問題・エラーメッセージ

Daylocatorにinterval=14や15と指定してみましたが、
・初めの日(1月なら1/1)が表示されない
・2月や4月など、31日までない月は1,15,30日のように表示されない
という問題があります。

該当のソースコード

ax1.xaxis.set_major_formatter(dt.DateFormatter("%m/%d")) ax1.xaxis.set_major_locator(dt.DayLocator(interval=15)) ax1.set_xlim(date2num([data1.index.min(),data1.index.max()]))

補足情報(FW/ツールのバージョンなど)

python3
jupyternotebook

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

僕が以前作ったプログラム(の抜粋)です。

  • 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/21 09:28

編集2021/09/21 09:54
ikapy

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taihei_._

2021/09/22 05:35

丁寧なご回答ありがとうございます。 とても汎用性が高く、頂いたコードをこれからも参考にさせていただきます。 ありがとうございました。
guest

0

ベストアンサー

python

1ax1.xaxis.set_major_formatter(dt.DateFormatter("%m/%d")) 2ax1.xaxis.set_major_locator(dt.DayLocator(interval=15)) 3ax1.set_xlim(date2num([data1.index.min(),data1.index.max()]))

python

1ax1.xaxis.set_major_formatter(dt.DateFormatter("%m/%d")) 2ax1.xaxis.set_major_locator(dt.DayLocator([1,15,min(data1.index[-1].date().day,30)])) 3ax1.set_xlim(date2num([data1.index.min(),data1.index.max()]))

に変更してみてください。

投稿2021/09/21 08:17

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taihei_._

2021/09/22 05:36

ご回答ありがとうございます。 求めていた通りになりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問