matplotlibに保存された画像の周りの空白を削除する


172

画像を取り、いくつかのプロセスの後に保存する必要があります。図を表示すると問題なく見えますが、図を保存した後、保存した画像の周りに空白ができました。私は方法の'tight'オプションを試しましたがsavefig、うまくいきませんでした。コード:

  import matplotlib.image as mpimg
  import matplotlib.pyplot as plt

  fig = plt.figure(1)
  img = mpimg.imread(path)
  plt.imshow(img)
  ax=fig.add_subplot(1,1,1)

  extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
  plt.savefig('1.png', bbox_inches=extent)

  plt.axis('off') 
  plt.show()

図でNetworkXを使用して基本的なグラフを描き、保存しようとしています。グラフがなくても機能することに気付きましたが、グラフを追加すると、保存した画像の周囲に空白ができます。

import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx

G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1,3)
G.add_edge(1,2)
pos = {1:[100,120], 2:[200,300], 3:[50,75]}

fig = plt.figure(1)
img = mpimg.imread("C:\\images\\1.jpg")
plt.imshow(img)
ax=fig.add_subplot(1,1,1)

nx.draw(G, pos=pos)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches = extent)

plt.axis('off') 
plt.show()


私にとって実際に機能したのは、pdfcropなどの別のツールを使用してPDFをトリミングすることでした。
toliveira

回答:


169

私の「解決策」がなぜ、どのように機能するのかを正確に把握しているとは言えませんが、これは、白い余白のない2つの翼セクションの輪郭をPDFファイルにプロットするときに必要でした。(IPythonノートブック内で-plabフラグを指定してmatplotlibを使用したことに注意してください。)

plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
            hspace = 0, wspace = 0)
plt.margins(0,0)
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.savefig("filename.pdf", bbox_inches = 'tight',
    pad_inches = 0)

私はこれのさまざまな部分を非アクティブ化しようとしましたが、これは常にどこかに白いマージンをもたらします。これを変更して、マージンの不足によって太い線が図の限界近くに剃られないようにすることもできます。


6
最後に、うまくいくもの、ありがとうございました!ちなみに、私の場合は2行使用するだけで済みましたset_major_locator
Florian Brucker、2015年

6
私は過去1時間をさまざまなことに挑戦しましたが、1pxの白い境界線を取り除くことができませんでした。これが機能した唯一のものでした-特にpad_inches=0他の答えが言及していないもの。
AnnanFay 2016年

1
set_major_locator私にとって鍵でした。
kmac

16
pad_inches助けて頂きました。
Myles Baker

5
matplotlib.ticker.NullLocator()
Joop

200

次のように設定してbbox_inches="tight"、空白のパディングを削除できますsavefig

plt.savefig("test.png",bbox_inches='tight')

引数をbbox_inches文字列として入力する必要があります。おそらくこれが、以前は機能しなかった理由です。


可能な重複:

Matplotlibプロット:軸、凡例、空白の削除

matplotlib図のマージンを設定するにはどうすればよいですか?

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


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

30
それはありませんかなり右。このbbox_inchesオプションを使用する場合、いくつかのスペースを残す別のデフォルトがあります。本当にすべてを取り除きたい場合は、も使用する必要がありますpad_inches=0.0。もちろん、そのようなタイトなパディングは、指数などを頻繁に遮断します...
Mike

5
ブラックエッジも削除するには、設定が必要になる場合がありますpad_inches=-0.1
lenhhoxung

10
これは単に機能せず、Figureの周りに空白が表示されます。(いくつかの回答で述べられているように)透過オプションを設定しても実際には効果がありません。空白はまだそこにあり、透過のみです。
BjornW 2018

1
@piperchesterは良い質問ですが、コメントで迷子にならないように、おそらく新しい質問としてまとめて質問する必要があります。ただし、新しい質問を古い質問にリンクする必要があります。
フック

21

上記の答えを試してもうまくいかなかった後(そして他のスタックの投稿がたくさん)、最終的に私にとってうまくいったのはちょうど

plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
            hspace = 0, wspace = 0)
plt.margins(0,0)
plt.savefig("myfig.pdf")

重要なことに、これにはbboxやパディング引数は含まれません。


4
これは受け入れられる答えになるはずです。また、を呼び出す必要もありませんset_axis_offsubplots_adjust軸がFigureの範囲外にあり、ヘンブがとにかくプロットされないため、保存されたイメージには影響しません。ただし、Jupyterノートブックでは、インラインバックエンドがこれらの設定を上書きするため、軸を明示的に無効にする必要があります。
MaxPowers

20

私はArvind Pereira(http://robotics.usc.edu/~ampereir/wordpress/?p=626)から何かを見つけ、私のために働いているように見えました:

plt.savefig(filename, transparent = True, bbox_inches = 'tight', pad_inches = 0)

7
transparent=True問題がないように見えますが、空白を隠すだけなので、画像の寸法は問題ありません。
Veselinov

言及してくれてありがとうpad_inches!早くこのオプションを知っていたらよかったのに!
ingomueller.net

1
これはほとんどのプロットで機能しますが、これにより、混乱マトリックスの右側の境界が削除されました。小さなパディングを追加するだけpad_inches=.25
YTZ

14

次の関数には、上記のヨハネスの回答が組み込まれています。私はそれを複数の軸でテストしましたがplt.figureplt.subplots()うまく動作します。

def save(filepath, fig=None):
    '''Save the current image with no whitespace
    Example filepath: "myfig.png" or r"C:\myfig.pdf" 
    '''
    import matplotlib.pyplot as plt
    if not fig:
        fig = plt.gcf()

    plt.subplots_adjust(0,0,1,1,0,0)
    for ax in fig.axes:
        ax.axis('off')
        ax.margins(0,0)
        ax.xaxis.set_major_locator(plt.NullLocator())
        ax.yaxis.set_major_locator(plt.NullLocator())
    fig.savefig(filepath, pad_inches = 0, bbox_inches='tight')

魅力のように働いた。以前の答えは、私のエクスポートで必要ないくつかのコマンドでした。
ケビンS

11

次のコードはこの仕事に最適です。

fig = plt.figure(figsize=[6,6])
ax = fig.add_subplot(111)
ax.imshow(data)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.set_frame_on(False)
plt.savefig('data.png', dpi=400, bbox_inches='tight',pad_inches=0)

2
一般的に、回答にコードの目的、および他の人を紹介することなく問題を解決する理由の説明が含まれている場合、回答ははるかに役立ちます。
Tim Diekmann、2018年

7

私はこのシーケンスに従って、それは魅力のように働きました。

plt.axis("off")
fig=plt.imshow(image array,interpolation='nearest')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig('destination_path.pdf',
    bbox_inches='tight', pad_inches=0, format='pdf', dpi=1200)

1
実際、この答えは簡単で使いやすいと思いました。
sikisis

1
これは私のために働いた。受け入れられた答えはしませんでした。
Joe

3

インチではなくピクセル単位で作業したい場合は、これで十分です。

加えて、通常必要なもの

from matplotlib.transforms import Bbox

次に、以下を使用できます。

my_dpi = 100 # Good default - doesn't really matter

# Size of output in pixels
h = 224
w = 224

fig, ax = plt.subplots(1, figsize=(w/my_dpi, h/my_dpi), dpi=my_dpi)

ax.set_position([0, 0, 1, 1]) # Critical!

# Do some stuff
ax.imshow(img)
ax.imshow(heatmap) # 4-channel RGBA
ax.plot([50, 100, 150], [50, 100, 150], color="red")

ax.axis("off")

fig.savefig("saved_img.png",
            bbox_inches=Bbox([[0, 0], [w/my_dpi, h/my_dpi]]),
            dpi=my_dpi)

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


dpiを指定する必要はありません。fig.dpi代わりにデフォルトのdpiを使用できます
intsco

1

私が見つけたはるかに簡単なアプローチは使用することplt.imsaveです:

    import matplotlib.pyplot as plt
    arr = plt.imread(path)
    plt.imsave('test.png', arr)

過小評価された答え。これは、解像度を維持して空白を削除する方法を長い間探した結果、私に役立ちましたplt.savefig()
nihal111

これは、配列(!)を画像として保存する場合にのみ機能します。これにより、任意の図を保存することはできません。
MaxPowers

任意の画像とはどういう意味ですか?画像は値の配列ではありませんか?
Parth92

0

これを試してみてください。それは私の問題を解決しました。

import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img, cmap=cmap)

-1

保存する内容を表示したい場合は、plt.tight_layout変換を使用することをお勧めします。これは、plt.savefig

import matplotlib as plt    
plt.plot([1,2,3], [1,2,3])
plt.tight_layout(pad=0)
plt.savefig('plot.png')

-4

これは私にとっては、imshowでプロットされた配列をファイルに保存するのに役立ちます

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,10))
plt.imshow(img) # your image here
plt.axis("off")
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
        hspace = 0, wspace = 0)
plt.savefig("example2.png", box_inches='tight', dpi=100)
plt.show()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.