実現したいこと
python3のmatplotlibに関する質問です。
pandasのデータフレームが複数用意されており、indexにはdatetime形式の年月日と時刻が入っています。
それぞれのデータフレームの長さや開始日時はすべて異なります。
これらのデータに対して次のようなグラフを作ろうと思っています。
発生している問題・分からないこと
fig.add_axes
を利用してデータ長とデータ開始時刻に合わせてグラフを書いてみたのですが、それぞれの横軸がぴったり合ってくれません(14:00のところなど)。
fig.add_axes
がグラフ外の余白など?も含めて長さを決めているからなのかなと思っているのですが、何かいい方法はないでしょうか?
該当のソースコード
python
1fig = plt.figure(figsize = (16,8)) 2year_list = [2021, 2021, 2021, 2021, 2022, 2022, 2022, 2022, 2022, 2022, 2023, 2023, 2023, 2023, 2023] 3ID_list = [17008, 18018, 20028, 20029, 16017, 16019, 16022, 20028, 20029, 22034, 20028, 22033, 22034, 22037, 22038] 4places = [1,2,7,3,3,4,5,4,5,6,6,3,2,1,1] #それぞれのグラフが何段目か 5plt.rcParams["font.size"] = 18 6 7for j, year, ID in zip(places, year_list, ID_list): 8 df2 = load_and_format(year,ID) #データをロードする部分 9 10 graph_left_h = int(str(df2.index[0])[11:13]) #データのinndexのはじめの値から"時"を抜き出す 11 graph_left_m = int(str(df2.index[0])[14:16]) #データのinndexのはじめの値から"分"を抜き出す 12 left = ((graph_left_h-6.5)+(graph_left_m/60))/12 #グラフの左端の場所を決める 13 14 ax = fig.add_axes([left,1 - j*0.13,len(df2)/3600/12,0.08]) 15 ax.scatter(df2.index, df2["data1"]*0.5, color = "red", s = 30) 16 17 ax.set_ylim(0,1) 18 ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) 19 ax.xaxis.set_major_locator(mdates.HourLocator()) 20 ax.tick_params(left=False, labelleft=False) 21 22# ここから一番下の軸を書く部分 23ax_bottom = fig.add_axes([0,0,1,0.01]) 24ax_bottom.plot(pd.date_range("6:30:30","18:30:30", freq='H'),np.ones(13)*10) 25ax_bottom.set_ylim(0,1) 26ax_bottom.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) 27ax_bottom.xaxis.set_major_locator(mdates.HourLocator()) 28ax_bottom.tick_params(left=False, labelleft=False) 29ax_bottom.spines[['left','right','top']].set_visible(False) 30 31plt.show()
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
sharex
を使おうかとも思ったのですが、それぞれのデータの年と日付が異なります。
時刻だけshareする方法はないでしょうか。すべてのデータの年月日を書き換えてから軸をシェアするのが最善でしょうか?
補足
Jupyter notebookを使っています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/04/24 19:50