Python matplotlib-具有固定纵横比的子地块

Python matplotlib-具有固定纵横比的子地块,python,matplotlib,Python,Matplotlib,我在绘制多个子地块时遇到问题。我想将子地块的物理纵横比设置为固定值。 在我的例子中,我在A4图上有12个子图(4行3列)。所有子图都很好地放置在整个图上,对于所有子图,高度几乎等于宽度 但是如果我把我的人像的布局改为纵向,子图就会垂直拉伸。 这正是不应该发生的事情。我希望子地块的高度和宽度与景观图上的相同。子地块的纵横比是否可能保持不变 提前感谢,, 彼得 编辑: 我找到了一个解决办法。但这只适用于非对数轴 aspectratio=1.0 ratio_default=(ax.get_xlim()

我在绘制多个子地块时遇到问题。我想将子地块的物理纵横比设置为固定值。 在我的例子中,我在A4图上有12个子图(4行3列)。所有子图都很好地放置在整个图上,对于所有子图,高度几乎等于宽度

但是如果我把我的人像的布局改为纵向,子图就会垂直拉伸。 这正是不应该发生的事情。我希望子地块的高度和宽度与景观图上的相同。子地块的纵横比是否可能保持不变

提前感谢,, 彼得

编辑: 我找到了一个解决办法。但这只适用于非对数轴

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)

事实上,你想要的很简单。。。您只需确保轴上的
可调
设置为
'box'
,并且为轴设置了纵横比(除了
'auto'
之外的任何选项)

创建子批次时,您可以使用
可调
kwarg来执行此操作。或者,您可以在创建后通过调用
ax.set\u可调('box')
,或者通过调用
ax.set\u aspect(aspect,adjustable='box')
(aspect是
'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()

现在,比较顶部子地块如何响应调整大小,以及底部子地块如何响应:


最初的情节

调整为垂直布局的大小:

调整为水平布局的大小:

你的变通方法对我很有效。绘制数据后,我调用以下函数:

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')

在回答对原始问题的编辑中关于解决方案不适用于对数图的评论时,您需要进行如下调整:

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')

(半对数图的适应性现在应该很明显)

Hi!谢谢你的回复。不幸的是,这仅设置子地块轴的纵横比。因为我有很多不同的轴范围,所以我必须为每个子地块分别设置这个纵横比。所以我想做的是将我的子图(不仅仅是轴)的高度和宽度设置为一个特定的纵横比。这对我来说很好。我修改了函数以接受一个
ax
参数,以便将其应用于子批。我还将
gca().axs
替换为
ax
gca()
替换为
ax
。谁是
gca()
?@VictorEijkhout。