2013-04-17 2 views
12

Matplotlib/Pyplot에 일관된 캔버스 크기의 플롯을 생성하고 싶습니다. 즉, 축 설명을 수용하기 위해 다양한 크기를 가질 수 있지만 플로팅 영역 (곡선이 그려지는 사각형)은 항상 같은 크기 여야합니다.Matplotlib에 플로팅 캔버스의 크기 설정

간단한 방법이 있습니까? pyplot.figure()의 figsize 옵션은 캔버스의 크기가 아닌 그림의 전체 크기를 설정하는 것으로 보이므로 축 설명이 더 많거나 적은 공간을 차지할 때마다 다른 캔버스 크기를 얻습니다.

+0

'gridspec'을 사용하면 원하는 내용을 제어 할 수 있습니다 (마지막 3 개의 예제 참조) (http://matplotlib.org/examples/pylab_examples/demo_tight_layout.html). 문제를 일으키는 다른 축 설명을 보여주는 몇 가지 예제를 추가 할 수 있습니까? – Bonlenfum

+0

이것은 MPL이 무엇을 그려야하는지에 대한 설명을 분리하고 _how_를 그리는 데 드는 비용입니다. 이 작업을 수작업으로하고, 'tight_layout'을 신중하게 피하는 것이 가장 좋은 방법입니다. – tacaswell

답변

12

이것은 Matplotlib의 가장 큰 좌절감 중 하나입니다. 저는 래스터 데이터로 작업합니다. 예를 들어 컬러 맵, 범례 및 일부 제목을 추가하고 싶습니다. 그렇게하는 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) 

참고 :

그림을로드하고 동일한 해상도를 그대로 그냥 출력으로 시작하자. 당신이 레이블 또는 colorbars 등

이 예를 들어 수 있도록 이미지 주위에 약간의 여백을 추가 할 수 있습니다 위와 같이 유사한 방법으로

는 제목을 플로팅에 사용되는 이미지, 위의 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가 그렇게 쉽게 할 수 있어야한다고 생각한다. 다른 사후 처리는 더 어려울 것입니다. –

관련 문제