2013-04-17 60 views
12

大小我想Matplotlib/Pyplot生成具有一致的畫布大小地塊。也就是說,這些數字可以具有不同的大小以容納軸描述,但繪圖區(繪製曲線的矩形)應始終具有相同的大小。設置繪圖畫布在Matplotlib

有沒有一種簡單的方法來實現這一目標? pyplot.figure()的選項figsize似乎設置了圖形的整體大小,而不是畫布的大小,因此,只要軸描述佔用更多或更少的空間,我就會得到不同的畫布大小。

+0

這有可能是'gridspec'允許你控制你想要什麼(見最後3 [這裏的例子(http://matplotlib.org/examples/pylab_examples/demo_tight_layout.html))。你能否添加一些顯示不同軸描述的例子來引起問題? – Bonlenfum

+0

這是MPL解耦繪製和繪製內容描述的代價。很確定,親自動手做這件事,並努力避免'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尺寸被均等地減小。這會產生更大(整體)的輸出圖像,但軸區域的大小仍然相同。

這可能是不錯的有一個數字或軸財產一樣.set_scale()來強制一個真正的1對X輸出。

+0

你可以使用一些矢量格式嗎?它_should_(我認爲)繪製每個像素爲矩形。或者僅僅是樣品。 – tacaswell

+2

謝謝,你的建議奏效!順便說一句,我想我在調用figure()之後立即使用subplot_adjust(0,0,1,1)找到了一種更優雅的方式。然後,您不需要定義座標軸位置,因爲它們已經和圖形一樣大。 最後,如果您不想手動指定邊距,則可以使用參數bbox_inches ='tight'調用savefig()。在這種情況下,繪圖區域將與(xinch,yinch)所定義的完全相同,並且該圖的大小足以容納軸描述。 (正如tcaswell所指出的,不要使用tight_layout!) – Dario

+0

這聽起來很簡單,謝謝你的提示。我會在稍後嘗試你的建議。 @tcaswell,謝謝,這可能在某些情況下工作,我認爲pcolor應該能夠很容易地做到這一點。但是任何其他後處理都會更困難。 –