web-dev-qa-db-ja.com

scipy:フレーム、軸、コンテンツのみのないsavefig

Numpy/scipyでは、配列に画像が保存されています。表示できます。savefigwithout任意の境界線、軸、ラベル、タイトル、...を使用して保存します。

PyPNGや_scipy.misc.imsave_のようなパッケージは避けたいのですが、時々問題があります(それらは常にうまくインストールされるとは限らず、基本的なsavefig()だけです)

66
Jakub M.

想定:

_import matplotlib.pyplot as plt
_

フレームなしの図を作成するには:

_fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)
_

コンテンツを図全体に埋めるには

_ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
_

次に、その上に画像を描画します。

_ax.imshow(your_image, aspect='normal')
fig.savefig(fname, dpi)
_

aspectパラメーターはピクセルサイズを変更して、fig.set_size_inches(…)で指定されたFigureサイズを満たすようにします。この種のことをどのようにプレイするかの感覚をつかむには、 matplotlibのドキュメント を読んでください。特にAxes、Axis、Artistのテーマについて読んでください。

89
matehat

より簡単な解決策は次のようです:

fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
55
weatherfrog

軸内で画像のbboxを見つけることができます(get_window_extent)、およびbbox_inchesパラメータは、画像のその部分のみを保存します。

import numpy as np
import matplotlib.pyplot as plt

data=np.arange(9).reshape((3,3))
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
plt.axis('off')
plt.imshow(data)

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

このトリックをJoe Kingtonから学んだ ここ

24
unutbu

私の場合、いくつかのオプションを試しましたが、最良の解決策は次のとおりです。

fig.subplots_adjust(bottom = 0)
fig.subplots_adjust(top = 1)
fig.subplots_adjust(right = 1)
fig.subplots_adjust(left = 0)

savefigを使用して図を保存します

15
Cagri Sarigoz

here からわずかに追加したheron13の回答をお勧めします。bboxをタイトモードに設定した後に残っているパディングを削除するためです。したがって、

axes = fig.axes()
axes.get_xaxis().set_visible(False)
axes.get_yaxis().set_visible(False)
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
8

これは私のために働く

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

librosa を使用して視覚化を行っているときに、他の情報なしでプロットの内容を抽出したいときに同じ問題が発生しました。これが私のアプローチです。 unutbuの回答は、仕事をするのにも役立ちます。

    figure = plt.figure(figsize=(500, 600), dpi=1)
    axis = plt.subplot(1, 1, 1)
    plt.axis('off')
    plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off',
                    labelright='off', labelbottom='off')

     # your code goes here. e.g: I used librosa function to draw a image
    result = np.array(clip.feature_list['fft'].get_logamplitude()[0:2])
    librosa.display.specshow(result, sr=api.Clip.RATE, x_axis='time', y_axis='mel', cmap='RdBu_r')


    extent = axis.get_window_extent().transformed(figure.dpi_scale_trans.inverted())
    plt.savefig((clip.filename + str("_.jpg")), format='jpg', bbox_inches=extent, pad_inches=0)
    plt.close()
3
GPrathap

上記の回答は余白とパディングの削除に対応していますが、ラベルを削除する際に私には機能しませんでした。後でこの質問に出くわした人のために、ここでうまくいったことがあります:

imagesに保存された4つの画像からのサブプロットの2x2グリッドが必要だと仮定します。

matplotlib.pyplot.figure(figsize = (16,12)) # or whatever image size you require
for i in range(4):
    ax = matplotlib.pyplot.subplot(2,2,i+1)
    ax.axis('off')
    imshow(images[i])
matplotlib.pyplot.savefig(path, bbox_inches='tight')
2
curious

Jupyterでこれをやろうとしている人のために

 plt.axis('off')

 spec = plt.imshow

 plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)
1
Krackle

ここでのヒントを使用して、ボーダーも削除しようとしましたが、実際には何も機能しませんでした。いじくり回すと、faceolorを変更してもjupyterラボで境界線が表示されないことがわかりました(どの色でも白い境界線は削除されます)。お役に立てれば。

def show_num(data):
data = np.rot90(data.reshape((16,16)), k=3)
data = np.fliplr(data)
fig = plt.figure(frameon=False, facecolor='white')
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(data)
plt.show()

enter image description here

0
Atom Scott