2011-11-21 12 views
39

numpy/scipyでは、イメージを配列に格納しています。私はそれを表示することができます、savefigを使用しないで保存します。境界線、軸、ラベル、タイトルなどはありません。scipy:フレーム、軸、内容なしのセーブコンフィグ

import matplotlib.pyplot as plt 

は図を作成するには:

私は PyPNGまたは scipy.misc.imsaveのようなパッケージを避けたい

、彼らはいつも私

答えて

56

のための基本的なsavefig()と仮定すると、うまくインストールしていない(時々問題がありますフレームなし:

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

ontent図全体に

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(…)に指定されたフィギュアの大きさを埋めることを確認するためにピクセルサイズを変更します。このようなことで遊ぶ方法を知りたい場合は、matplotlib's documentation、特にAxes、Axis、Artistのテーマを読んでください。

+3

いや、私は画像が正方形でない場合は忘れてしまったので、私はまだいくつかの小さな透明の境界線を持っている、と私がしたいことはALL_で_no国境で、純粋なイメージ –

+0

はたぶん、それはです:P。 'aspect'パラメータを追加するように編集しました。今はどうですか? – matehat

+1

grrr、いいえ、まだ同じです。画像の周りには小さくて透明な境界があり、隣にはほとんどピクセルがありません –

19

あなたは(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) 

私はジョー・キングトンhereからこのトリックを学びました。

+0

ちょうど 'plt.axis( 'off')' helped。他の答えはあまり役に立ちません。 – imsrgadich

39

簡単に解決策があるように思わ:

fig.savefig('out.png', bbox_inches='tight', pad_inches=0) 
+1

これは私のためにうまくいった。また、pad_inchesを希望のサイズに簡単に変更できます。ありがとう! – Curious2learn

+0

+1私のためにもうまくいった:) そして、これは実際に受け入れられた答えより簡単です –

+8

私はまだこれで白い余白を持っています。 –

4

私は私の場合は、いくつかのオプションを試したし、最善の解決策は、このでした:savefig

であなたの姿を保存し

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

4

私は、hereから少し借りてheron13の回答を提案し、bboxをtightモードに設定した後のパディングを削除します:

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

get_xaxis()とget_yaxis()が存在しないと言うエラーが表示されます。それがどうして起こるのか? –

+0

axes()オブジェクトを作成し、ax.xaxisとax.yaxisを使用してください – perigon

3

私は他の情報なしに、プロットの内容を抽出したいlibrosaを使用して、いくつかの可視化をしながら、私は同じ問題を抱えていました。だから私のアプローチ。うぬぼれの答えは私が働くことにも役立ちます。

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() 
+0

これは正しい軌道に乗りましたが、私は2つの問題がありました:1)フォントを避けるためにdpiを1より大きい数値に設定しなければならなかった私のジュピターノートのエラー。 2)まだ小さな境界があったので、エクステントBboxをextent.get_points()* np.array([[1.1]、[。9]))に手動で変更する必要があります。 –

+0

他の人に役立つかもしれない答えを実行してくれてありがとう。 – GPrathap

関連する問題