web-dev-qa-db-ja.com

Matplotlibでのプロットキャンバスのサイズの設定

Matplotlib/Pyplotが一貫したキャンバスサイズでプロットを生成するようにしたいと思います。つまり、図は軸の説明に対応するためにさまざまなサイズを持つことができますが、プロット領域(曲線が描かれる長方形)は常に同じサイズでなければなりません。

それを達成する簡単な方法はありますか? pyplot.figure()のオプションfigsizeは、キャンバスのサイズではなく、図の全体のサイズを設定するようです。そのため、軸の説明が多かれ少なかれスペースを占めるときはいつでも、異なるキャンバスサイズを取得します。

16
Dario

これは、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サイズは等しく減少します。これにより、全体的な出力画像が大きくなりますが、Axes領域のサイズは変わりません。

真の1-on-x出力を強制するために.set_scale()のようなFigureまたはAxesプロパティを持っているのはいいかもしれません.

12
Rutger Kassies

Matplotlib rcで次の設定を指定できます。

import matplotlib
matplotlib.rcParams['figure.figsize'] = [10, 10] # for square canvas
matplotlib.rcParams['figure.subplot.left'] = 0
matplotlib.rcParams['figure.subplot.bottom'] = 0
matplotlib.rcParams['figure.subplot.right'] = 1
matplotlib.rcParams['figure.subplot.top'] = 1
1