2011-01-20 334 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地块现在应该是明显的)