Twinyを使用すると、Python Matplotlibの図のタイトルが軸のラベルと重なる


139

次のように、twinyを使用して、同じグラフに2つの別々の数量をプロットしようとしています。

fig = figure()
ax = fig.add_subplot(111)
ax.plot(T, r, 'b-', T, R, 'r-', T, r_geo, 'g-')
ax.set_yscale('log')
ax.annotate('Approx. sea level', xy=(Planet.T_day*1.3,(Planet.R)/1000), xytext=(Planet.T_day*1.3, Planet.R/1000))
ax.annotate('Geostat. orbit', xy=(Planet.T_day*1.3, r_geo[0]), xytext=(Planet.T_day*1.3, r_geo[0]))
ax.set_xlabel('Rotational period (hrs)')
ax.set_ylabel('Orbital radius (km), logarithmic')
ax.set_title('Orbital charts for ' + Planet.N, horizontalalignment='center', verticalalignment='top')


ax2 = ax.twiny()
ax2.plot(v,r,'k-')
ax2.set_xlabel('Linear speed (ms-1)')

show()

データは正常に表示されますが、図のタイトルが2番目のx軸の軸ラベルと重なって、ほとんど判読できないという問題が発生しています(ここに画像の例を投稿したかったのですが、まだ十分高い担当者)。

タイトルを数十ピクセル上に直接移動する簡単な方法があるかどうか知りたいので、チャートをきれいに見せます。


1
Stack Overflowへようこそ!あなたがあなたの写真の画像投稿にリンクしている場合、より高い担当者のユーザーがあなたの投稿に画像を埋め込みます。
フック

@マジック-この質問に対してどのような答えを受け入れるか再考しますか?Matplotlibは、この正確なニーズに対応するための組み込みメカニズムを追加しました(以下で最も投票された回答)
Amelio Vazquez-Reina

回答:


243

それがmatplotlibの新しいバージョンの新機能かどうかはわかりませんが、少なくとも1.3.1の場合、これは単純です。

plt.title(figure_title, y=1.08)

これはでも機能しますがplt.suptitle()、(まだ)plt.xlabel()では機能しません。


6
引数を設定できるラベルlabelpadについては、こちらをご覧ください
Felix Hoffmann

1
それは価値があるもののために、それは新機能ではありません。title撮影したxy(私が覚えてどのような割合で、長いと)非常に長い時間のための引数。
ジョー・キントン2014

3
plt.set_title( 'title string'、y = 1.08)は私のために働きます。
Yu Shen

3
誰かが1.08が何であるか、そしてデフォルトは何であるかを誰かが説明するなら、より役に立ちます。私の理解では、デフォルトは1です
kon psych

3
@JohnCummingsデフォルト値はy = 1で単位は "axes fraction"であるようです。つまり、y = 0.5はタイトルが軸の真ん中にあり、y = 0はタイトルが軸。
herrlich10 '19年

33

使用plt.titleを忘れて、で直接テキストを配置しますplt.text。誇張された例を以下に示します。

import pylab as plt

fig = plt.figure(figsize=(5,10))

figure_title = "Normal title"
ax1  = plt.subplot(1,2,1)

plt.title(figure_title, fontsize = 20)
plt.plot([1,2,3],[1,4,9])

figure_title = "Raised title"
ax2  = plt.subplot(1,2,2)

plt.text(0.5, 1.08, figure_title,
         horizontalalignment='center',
         fontsize=20,
         transform = ax2.transAxes)
plt.plot([1,2,3],[1,4,9])

plt.show()

ここに画像の説明を入力してください


@ user815423426はい、tight_layoutそれでも非標準のプレースメントではうまく機能しないようです。たぶん、バグレポートを作成できますか?
フック

2
tight_layoutを使用するとき、少なくともfigure.savefig()を使用してプロットを保存するときに、回避策を見つけました。場合はtitle = plt.title(...)このオプションを使用して、タイトルの周りにしっかりとプロットをフレームに指定することができ、その後 bbox_extra_artistsfigure.savefig(filename, bbox_extra_artists=(title), bbox_inches='tight')
junkaholik

10
ax.set_title('My Title\n', fontsize="15", color="red")
plt.imshow(myfile, origin="upper")

'\n'タイトル文字列の直後に置くと、プロットはタイトルのすぐ下に描画されます。それも速い解決策かもしれません。


8

xラベルがサブプロットのタイトルと重なるという問題がありました。これは私のために働きました:

import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 1)
ax[0].scatter(...)
ax[1].scatter(...)
plt.tight_layout()
.
.
.
plt.show()

ここに画像の説明を入力してください

ここに画像の説明を入力してください

参照:



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.