2011-01-20 336 views
19

我有繪製多個子圖的問題。我想將子圖的物理縱橫比設置爲固定值。 在我的例子中,我在景觀A​​4圖上有12個子圖(4行和3列)。在整個圖中,所有的小區都很好地放置,對於所有的小區,高度幾乎等於寬度。matplotlib - 固定長寬比的子圖

但是,如果我將圖形的佈局更改爲肖像,則子圖是垂直拉伸的。 而這正是不應該發生的事情。我想要有和小地圖一樣高度和寬度的小區域。子圖的縱橫比是否保持不變?

由於提前, 彼得

編輯: 我已經找到了解決辦法。但是,這僅僅適用於非數軸...

aspectratio=1.0 
ratio_default=(ax.get_xlim()[1]-ax.get_xlim()[0])/(ax.get_ylim()[1]-ax.get_ylim()[0]) 
ax.set_aspect(ratio_default*aspectratio) 

回答

15

其實,你想很簡單...你只需要確保adjustable設置爲'box'你的斧頭,和你有一個設定的軸高寬比(除了'auto'以外的任何其他)。

您可以在創建子圖時用adjustable kwarg做到這一點。或者,您可以在創建後通過撥打ax.set_adjustable('box')或致電ax.set_aspect(aspect, adjustable='box')(其中方面是'equal'或數字)來完成此操作。

現在,無論數字如何調整大小,子圖都將保持相同的寬高比。

例如:

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax1 = fig.add_subplot(2,1,1, adjustable='box', aspect=0.3) 
ax2 = fig.add_subplot(2,1,2) 

ax1.plot(range(10)) 
ax2.plot(range(10)) 

plt.show() 

現在,比較上面的插曲如何應對調整,對如何底部插曲迴應:


最初的情節 alt text

調整爲垂直佈局: alt text

調整爲橫向佈局: alt text

+0

我站在糾正。很高興知道。 – 2011-01-20 23:49:56

+0

嗨!感謝您的回覆。不幸的是,這隻設置了子圖的軸的縱橫比。由於我有很多不同的我的軸範圍,我將不得不爲每個子圖單獨設置此縱橫比。所以我想要做的是將我的子圖(不僅僅是軸)的高度和寬度設置爲特定的高寬比。 – 2011-01-21 07:22:50

3

你的解決方法爲我工作。繪製數據後,我撥打下列功能:

def fixed_aspect_ratio(ratio): 
    ''' 
    Set a fixed aspect ratio on matplotlib plots 
    regardless of axis units 
    ''' 
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim() 

    xrange = xvals[1]-xvals[0] 
    yrange = yvals[1]-yvals[0] 
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box') 
1

在回答有關在編輯到原來的問題解決沒有工作的數圖的一句話 - 你需要適應如下:

def fixed_aspect_ratio_loglog(ratio): 
    ''' 
    Set a fixed aspect ratio on matplotlib loglog plots 
    regardless of axis units 
    ''' 
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim() 

    xrange = log(xvals[1])-log(xvals[0]) 
    yrange = log(yvals[1])-log(yvals[0]) 
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box') 

(適應semilog地塊現在應該是明顯的)