キャンバスを割付したい(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モジュールと組み合わせて利用します。