キャンバスを割付したい(matplotlib.pyplot.subplot_mosaic)
1import matplotlib.pyplot as plt
2
3# キャンバスの割付を設定する
4# +-------+---+
5# | A | |
6# |-------| B |
7# | C | D | |
8# +---+---+---+
9# | E |
10# +-----------+
11
12# 結合するキャンバスは同じ名前にする
13panels = [
14 ["A", "A", "B"],
15 ["C", "D", "B"],
16 ["E", "E", "E"],
17]
18
19# キャンバスを作成する
20# fig: matplotlib.figure.Figure
21# axs: dict[str, matplotlib.axes.Axes]
22fig, axs = plt.subplot_mosaic(
23 mosaic=panels, # 割付を指定
24 layout="constrained", # レイアウト調整
25 figsize=(8, 6), # 縦長のキャンバスを作成
26)
27
28# 割付した名前を使ってAxesオブジェクトを取り出す
29axs["A"].set_title("Panel A")
30axs["B"].set_title("Panel B")
31axs["C"].set_title("Panel C")
32axs["D"].set_title("Panel D")
33axs["E"].set_title("Panel E")
34
35# キャンバスを保存
36fig.savefig("subplot_mosaic.png", dpi=300) # 解像度を上げて保存
pyplot.subplot_mosaicを使って、複雑に分割したキャンバスを作成できます。
戻り値は、辞書型となっていて、Axesオブジェクトキーで取得できます。
注釈
mosaicはモザイク処理ではなく、タイルのことを指しているのだと思います。
論文したい
1# +----------------+------+
2# | main | |
3# |----------------+ cbar |
4# | sub1 | sub2 | |
5# +----------------+------+
6
7import matplotlib.pyplot as plt
8import numpy as np
9
10# レイアウトを設定する
11# セマンティクスを考慮して、名前をつけるとわかりやすい
12# main: メインのグラフ
13# cbar: カラーバー
14# sub1, sub2: サブのグラフ
15panels = [
16 ["main", "main", "cbar"],
17 ["sub1", "sub2", "cbar"],
18]
19
20# キャンバスを作成する
21fig, axs = plt.subplot_mosaic(
22 panels,
23 figsize=(10, 6),
24 layout="constrained",
25 gridspec_kw={"width_ratios": [1, 1, 0.05]}, # 列の幅を指定
26)
27
28# main: メインのグラフを描く
29axs["main"].plot(x, y)
30axs["main"].set_title("Main Result")
31axs["main"].set_xlabel("X-axis")
32axs["main"].set_ylabel("Y-axis")
33
34# sub1: サブのグラフを描く
35axs["sub1"].scatter(x, y1, s=10)
36axs["sub1"].set_title("Sub Plot 1")
37axs["sub1"].set_xlabel("X-axis")
38axs["sub1"].set_ylabel("Y-axis")
39
40# sub2: サブのグラフを描く
41axs["sub2"].scatter(x, y2, s=10)
42axs["sub2"].set_title("Sub Plot 2")
43axs["sub2"].set_xlabel("X-axis")
44axs["sub2"].set_ylabel("Y-axis")
45
46# cbar: カラーバーを描く
47sm = plt.cm.ScalarMappable(cmap="viridis")
48sm.set_array([]) # カラーバーの範囲を設定
49fig.colorbar(
50 sm,
51 cax=axs["cbar"],
52 orientation="vertical",
53 label="Colorbar"
54)
55
56# キャンバスを保存する
57fig.savefig("subplot_mosaic_paper.png", dpi=300)
論文などで利用することを想定したサンプルです。
メインのグラフとサブのグラフを分割して、カラーバーを配置しています。
gridspec_kwオプションで、列の幅を指定しています。
ダッシュボードしたい
1# +----------------+----------------+
2# | panel1 | panel2 |
3# |----------------+----------------|
4# | panel3 | panel4 |
5# +----------------+----------------+
6
7import matplotlib.pyplot as plt
8import numpy as np
9
10# レイアウトを設定する
11panels = [
12 ["panel1", "panel2"],
13 ["panel3", "panel4"],
14]
15
16# キャンバスを作成する
17fig, axs = plt.subplot_mosaic(
18 panels,
19 figsize=(12, 8),
20 layout="constrained",
21)
22
23# panel1: グラフを描く
24axs["panel1"].plot(x, y)
25axs["panel1"].set_title("Panel 1")
26axs["panel1"].set_xlabel("X-axis")
27axs["panel1"].set_ylabel("Y-axis")
28
29# panel2: グラフを描く
30axs["panel2"].scatter(x, y1, s=10)
31axs["panel2"].set_title("Panel 2")
32axs["panel2"].set_xlabel("X-axis")
33axs["panel2"].set_ylabel("Y-axis")
34
35# panel3: グラフを描く
36axs["panel3"].scatter(x, y2, s=10)
37axs["panel3"].set_title("Panel 3")
38axs["panel3"].set_xlabel("X-axis")
39axs["panel3"].set_ylabel("Y-axis")
40
41# panel4: グラフを描く
42axs["panel4"].scatter(x, y3, s=10)
43axs["panel4"].set_title("Panel 4")
44axs["panel4"].set_xlabel("X-axis")
45axs["panel4"].set_ylabel("Y-axis")
46
47# キャンバスを保存する
48fig.savefig("subplot_mosaic_dashboard.png", dpi=300)
ダッシュボードなどで利用することを想定したサンプルです。 4つのグラフを分割して配置しています。
注釈
リアルタイムで更新するダッシュボードを作る場合は、matplotlib.animationモジュールと組み合わせて利用します。