1. ホーム
  2. python

[解決済み] タイトルの位置は?

2022-02-19 14:45:07

質問

を調整しようとしています。 suptitle を調整する方法がわからず困っています。 figsize と表示され、その後に字幕が表示されます。

を呼び出すことが問題なのです。 plt.suptitle("my title", y=...) の位置を調整するために、図の寸法も調整されます。少し質問です。

  1. はどこにあるのでしょうか? suptitle(..., y=1.1) 実際にタイトルを入れるのは?私が知る限りでは、このメソッドは y suptitleのパラメータが指すのは matplotlib.text.Text(テキスト しかし、複数のサブプロットがある場合、図座標の意味がわかりません。

  2. を指定した場合、図のサイズにどのような影響があるのでしょうか? y から suptitle ?

  3. 図のサイズと間隔を手動で調整する方法 ( subplots_adjust 図中の各軸のサイズを維持したまま、パネルごとに図のタイトルを追加し、図全体に字幕を追加することはできますか?

一例です。

data = np.random.random(size=100)
f, a = plt.subplots(2, 2, figsize=(10, 5))

a[0,0].plot(data)
a[0,0].set_title("this is a really long title\n"*2)
a[0,1].plot(data)
a[1,1].plot(data)

plt.suptitle("a big long suptitle that runs into the title\n"*2, y=1.05);

もちろん、図を作るたびにyを微調整することはできますが、手動で操作しなくても概ねうまくいくようなソリューションが必要です。制約付きレイアウトとタイトレイアウトの両方を試しましたが、どちらもどんな複雑な図形でも確実に動作しません。

解決方法は?

1. 図形の座標の意味は何ですか?

図の座標は0から1まであり、(0,0)は左下隅、(1,1)は右上隅を表します。の座標は y=1.05 は、図から少し外れることになります。

2. suptitleにyを指定した場合、図のサイズにどのような影響があるのでしょうか?

指定方法 y は、図のサイズに全く影響を与えません。

3a. 図のサイズと間隔を手動で調整し、パネルごとに図のタイトルを追加し、図全体に字幕を追加するにはどうすればよいですか?

まず、改行を追加しないことです。つまり、2行にしたい場合は、3つの改行を使わないことです( \n ). それから、サブプロットパラメータを任意に調整し、タイトルのためのスペースを確保することができます。例 fig.subplots_adjust(top=0.8) を使用し y <= 1 は、図の中に入るようにタイトルを設定します。

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random(size=100)
fig, axes = plt.subplots(2, 2, figsize=(10, 5))
fig.subplots_adjust(top=0.8)

axes[0,0].plot(data)
axes[0,0].set_title("\n".join(["this is a really long title"]*2))
axes[0,1].plot(data)
axes[1,1].plot(data)

fig.suptitle("\n".join(["a big long suptitle that runs into the title"]*2), y=0.98)

plt.show()

3b. ... 図中の各軸の大きさを維持したまま?

軸の大きさを維持しつつ、タイトルのための十分なスペースを確保するためには、図全体のサイズを変更する必要があります。

これは以下のようなもので、関数 make_space_above 軸の配列を入力とし、新たに希望する上部の余白をインチ単位で取得します。例えば、タイトルを表示するために上部に1インチの余白が必要であるという結論に至ったとします。

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random(size=100)
fig, axes = plt.subplots(2, 2, figsize=(10, 5), squeeze = False)

axes[0,0].plot(data)
axes[0,0].set_title("\n".join(["this is a really long title"]*2))
axes[0,1].plot(data)
axes[1,1].plot(data)

fig.suptitle("\n".join(["a big long suptitle that runs into the title"]*2), y=0.98)


def make_space_above(axes, topmargin=1):
    """ increase figure size to make topmargin (in inches) space for 
        titles, without changing the axes sizes"""
    fig = axes.flatten()[0].figure
    s = fig.subplotpars
    w, h = fig.get_size_inches()

    figh = h - (1-s.top)*h  + topmargin
    fig.subplots_adjust(bottom=s.bottom*h/figh, top=1-topmargin/figh)
    fig.set_figheight(figh)


make_space_above(axes, topmargin=1)    

plt.show()

(左:呼び出しなし make_space_above を呼び出した場合。 make_space_above(axes, topmargin=1) )