2013-04-17 30 views
12

Matplotlib/Pyplotに一貫したキャンバスサイズのプロットを生成させたいと思います。つまり、軸の説明に合わせて図のサイズを変えることはできますが、描画領域(曲線が描かれる長方形)は常に同じサイズにする必要があります。Matplotlibのプロットキャンバスのサイズを設定する

これを達成する簡単な方法はありますか? pyplot.figure()のfigsizeオプションは、キャンバスのサイズではなく、Figure全体のサイズを設定するように見えるので、軸の記述が多かれ少なかれ占有するたびに異なるキャンバスサイズになります。

+0

'gridspec'は、あなたが望むものを制御することができます(最後の3つの例を参照してください)(http://matplotlib.org/examples/pylab_examples/demo_tight_layout.html))。問題を引き起こす異なる軸の記述を示すいくつかの例を追加できますか? – Bonlenfum

+0

これは、MPLが何を描画するかの記述と、それを描画するための_how_の記述を分離する方法のコストです。これを手作業で行い、 'tight_layout 'を慎重に避けることは、これを行う最善の方法です。 – tacaswell

答えて

12

これは、Matplotlibでの私の最大の不満の1つです。私はしばしばラスタデータを使って作業します。たとえば、カラーマップ、凡例、およびいくつかのタイトルを追加したいとします。これを行うmatplotlibギャラリーの簡単な例では、解像度が異なるため、データが再サンプリングされます。特に画像解析を行うときには、不要なリサンプリングをしないでください。

ここに私が通常行っていることがありますが、もっとシンプルで良い方法があるかどうかを知りたいです。それは全体図にまたがるので、私は手動で軸位置を定義

import matplotlib.pyplot as plt 
import urllib2 

# load the image 
img = plt.imread(urllib2.urlopen('http://upload.wikimedia.org/wikipedia/en/thumb/5/56/Matplotlib_logo.svg/500px-Matplotlib_logo.svg.png')) 

# get the dimensions 
ypixels, xpixels, bands = img.shape 

# get the size in inches 
dpi = 72. 
xinch = xpixels/dpi 
yinch = ypixels/dpi 

# plot and save in the same size as the original 
fig = plt.figure(figsize=(xinch,yinch)) 

ax = plt.axes([0., 0., 1., 1.], frameon=False, xticks=[],yticks=[]) 
ax.imshow(img, interpolation='none') 

plt.savefig('D:\\mpl_logo.png', dpi=dpi, transparent=True) 

画像をロードし、それが同じ解像度であるだけとして出力で開始します。あなたがラベルやカラーバーなど

この例を可能にするために、画像の周りにいくつかのマージンを追加することができ、上記と同様の方法で

は、タイトルをプロットするために使用されている画像、上記の20%のマージンを追加します。

fig = plt.figure(figsize=(xinch,yinch/.8)) 

ax = plt.axes([0., 0., 1., .8], frameon=False, xticks=[],yticks=[]) 
ax.imshow(img, interpolation='none') 
ax.set_title('Matplotlib is fun!', size=16, weight='bold') 

plt.savefig('D:\\mpl_logo_with_title.png', dpi=dpi) 

したがって、図形のyサイズ(高さ)が増加し、軸のyサイズが等しく減少します。これにより、より大きな(全体的な)出力画像が得られますが、軸領域は同じサイズになります。

真の1-on-x出力を強制するには、.set_scale()のようなFigureまたはAxesプロパティが必要な場合があります。

+0

代わりにベクター形式を使用できますか? _should_(私は思う)は、各ピクセルを矩形として描画します。または、サンプルをオーバーするだけです。 – tacaswell

+2

ありがとうございます、あなたの提案はうまくいった! ところで、私は、figure()を呼び出した直後にsubplot_adjust(0,0,1,1)を使って少し優雅な方法を見つけたと思います。次に、軸の位置を定義する必要はありません。すでに図のように大きいからです。 最後に、マージンを手動で指定しない場合は、引数bbox_inches = 'tight'を指定してsavefig()を呼び出すことができます。この場合、プロッティング領域は(xinch、yinch)で定義されているとおりに正確になり、図は軸の記述に対応できる大きさになります。 (tcaswellが指摘しているように、tight_layoutは使用しないでください!) – Dario

+0

ヒントのおかげで、それは本当に簡単ですね。私はあなたの提案を後で試してみるでしょう。 @tcaswell、ありがとう、それはいくつかの状況で動作するかもしれない、私はpcolorは非常に簡単に行うことができるはずだと思う。しかし、他の後処理はもっと難しいでしょう。 –

関連する問題