matplotlibプロットの左右のマージンを減らす


178

matplotlibでプロットマージンを処理するのに苦労しています。以下のコードを使用してチャートを作成しました。

plt.imshow(g)
c = plt.colorbar()
c.set_label("Number of Slabs")
plt.savefig("OutputToUse.png")

しかし、プロットの両側にたくさんの空白がある出力図が表示されます。私はグーグルを検索してmatplotlibのドキュメントを読みましたが、これを減らす方法を見つけることができないようです。


問題extentは、imshow図のの空白の量、または図の周りに生成されたpngの境界の空白の量savefigですか?
unutbu

私は両方だと思います-表示ウィンドウとPNGの両方に多くのスペースがあるようです。ただし、重要な出力はによって生成されたpngファイルです。savefigそのため、これを並べ替えます。
robintw

あとはGIMPで切り抜いているところです。:/
エンドリス

回答:


251

これを自動的に行う1つの方法は、へのbbox_inches='tight'kwarg plt.savefigです。

例えば

import matplotlib.pyplot as plt
import numpy as np
data = np.arange(3000).reshape((100,30))
plt.imshow(data)
plt.savefig('test.png', bbox_inches='tight')

別の方法は使用することです fig.tight_layout()

import matplotlib.pyplot as plt
import numpy as np

xs = np.linspace(0, 1, 20); ys = np.sin(xs)

fig = plt.figure()
axes = fig.add_subplot(1,1,1)
axes.plot(xs, ys)

# This should be called after all axes have been added
fig.tight_layout()
fig.savefig('test.png')

5
これをデフォルトにする方法はありますか?
内部石

1
複数のサブプロットがあり、それぞれを保存したい場合は、これも一緒に使用できますfig.savefig()。(plt.savefig()その場合は機能しません。)
Abhranil Das 2013

1
これが行うのは、レンダリングされた画像をトリミングすることだけです。特定の解像度を適用しようとすると、画像が小さくなります。
2015年

5
@detly-はい。それはまさにそれが行うことです(ただし、「切り取って」、画像を大きくすることもできます)。あなたが望むものについては、を見てくださいfig.tight_layout()。この答えが最初に書かれたとき、その関数は存在しませんでした、さもなければ私はそれをより顕著に言及します。
Joe Kington、2015年

2
誰かが問題を抱えている場合は、fig = plt.gcf()
キョンフンキム

148

subplots_adjust()関数を使用して、matplotlibの図の周りの間隔を調整できます。

import matplotlib.pyplot as plt
plt.plot(whatever)
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)

これは、画面上のFigureとファイルへの保存の両方で機能し、1つのFigureに複数のプロットがない場合でも呼び出すのは適切な関数です。

数値は図の寸法の一部であり、図のラベルを許可するように調整する必要があります。


8
パラメータに割り当てられた値であり、どれだけ変更するかではなく、マージンを設定する場所です。つまり、右端のマージンを10%
増やし

1
plt.subplots_adjust()で負の値を指定できることは明らかです。そうすることで、図形領域の外側に描画したり、迷惑なマージンを処理したりすることもできます。
2014

これはGridSpecupdateメソッドを呼び出すことでオブジェクトに対しても機能します(stackoverflow.com/a/20058199/1030876を参照)。
Aaron Voelker 2017

57

あなたに必要なのは

plt.tight_layout()

あなたの出力の前。

マージンを削減することに加えて、これはサブプロット間のスペースをしっかりとグループ化します:

x = [1,2,3]
y = [1,4,9]
import matplotlib.pyplot as plt
fig = plt.figure()
subplot1 = fig.add_subplot(121)
subplot1.plot(x,y)
subplot2 = fig.add_subplot(122)
subplot2.plot(y,x)
fig.tight_layout()
plt.show()

7
これは本当に最良の方法だと思います。`bbox = 'tight'のようにFigureを保存する必要がなく、窮屈なFigureにおける他のあらゆる種類のレイアウトの問題を修正します。
dshepherd 2013

2
これは画像ではなく図に適用されるため、期待どおりに動作するため、これが正しい答えになるはずです。
Majid alDosari 2015年

不思議なことに、これは実際のプロットの幅も変更します(つまり、ピークは互いに近くなります)bbox_inches='tight'。これは、エッジの周りの空白をクリップするだけで、プロットはそのままにします。でフィギュアを作成しましたplt.figure(figsize=(10,3))
フリッツ

9

ax = fig.add_axes([left, bottom, width, height]) Figureのレイアウトを正確に制御したい場合にのみ使用してください。例えば。

left = 0.05
bottom = 0.05
width = 0.9
height = 0.9
ax = fig.add_axes([left, bottom, width, height])

6

誰かが適用後に白い余白の残りをどのように取り除くのか疑問に思った場合:plt.tight_layout()または(デフォルトである)fig.tight_layout()パラメータを使用すると、さらにきつくすることができます:「図の端と端の間のパディングフォントサイズの割合としてのサブプロット。」だから例えばpad1.08

plt.tight_layout(pad=0.05)

非常に小さなマージンにそれを減らします。パッティング0は、サブプロットのボックスも少し切り取ってしまうので、私にはうまくいきません。


4
plt.savefig("circle.png", bbox_inches='tight',pad_inches=-1)

1
"pad_inches = -1"を指定すると、savefigは図の一部しか生成しません。
Yu Shen

savefig関数でのパラメーターの使用は洗練されていますが、pad_inches必ずしも負の値が必要なわけではありません。
MichaelHuelsen 2017

0に設定し、助け
ジョープ

4

matplotlibs subplots_adjustの問題は、入力する値が、Figureのxおよびy figsizeに関連していることです。この例は、pdfの印刷のための正しい図表化のためのものです。

そのため、次のように相対間隔を絶対値に再計算します。

pyplot.subplots_adjust(left = (5/25.4)/figure.xsize, bottom = (4/25.4)/figure.ysize, right = 1 - (1/25.4)/figure.xsize, top = 1 - (3/25.4)/figure.ysize)

x次元で「figure.xsize」インチ、y次元で「figure.ysize」インチの図の場合。したがって、図全体の左マージンは5 mm、下マージンは4 mm、右マージンは1 mm、上端は3 mmでラベル内に配置されます。(x / 25.4)の変換は、mmをインチに変換する必要があるために行われます。

xの純粋なチャートサイズは「figure.xsize-左マージン-右マージン」であり、yの純粋なチャートサイズはインチで「figure.ysize-下マージン-上マージン」になることに注意してください。

他のスニペット(これらについてはわかりません。他のパラメーターを指定したかっただけです)

pyplot.figure(figsize = figureSize, dpi = None)

そして

pyplot.savefig("outputname.eps", dpi = 100)

3
どこで手に入れたxsizeysizeから。私はそれらのプロパティを使用して、次のように取得しますAttributeError: 'Figure' object has no attribute 'xsize'
cj5 2014年

4

上記のサミーの答えに触発されました:

margins = {  #     vvv margin in inches
    "left"   :     1.5 / figsize[0],
    "bottom" :     0.8 / figsize[1],
    "right"  : 1 - 0.3 / figsize[0],
    "top"    : 1 - 1   / figsize[1]
}
fig.subplots_adjust(**margins)

ここで、figsizeは、使用したタプルです。 fig = pyplot.figure(figsize=...)


2

私にとって、上記の回答はmatplotlib.__version__ = 1.4.3Win7 では機能しませんでした。したがって、画像自体にのみ関心がある場合(つまり、注釈、軸、目盛り、タイトル、ylabelなどが必要ない場合)、単純にnumpy配列を画像として保存することをお勧めしsavefigます。

from pylab import *

ax = subplot(111)
ax.imshow(some_image_numpyarray)
imsave('test.tif', some_image_numpyarray)

# or, if the image came from tiff or png etc
RGBbuffer = ax.get_images()[0].get_array()
imsave('test.tif', RGBbuffer)

また、opencv描画関数(cv2.line、cv2.polylines)を使用して、numpy配列に直接描画することもできます。http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html


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