Python Matplotlib以迭代方式设置子批次轴大小

Python Matplotlib以迭代方式设置子批次轴大小,python,matplotlib,scaling,subplot,axes,Python,Matplotlib,Scaling,Subplot,Axes,有几个相关的问题(、和),但建议的解决方案在我的案例中不起作用 我以迭代的方式创建子地块,所以我不知道每个子地块的宽度(它是在调用plt.subplot()后计算出来的),这意味着我无法在最初创建子地块时设置每个子地块的大小。 我想在创建子地块x轴后设置其大小 想象一下: items = [A,B,C] #this could have any number of items in it f,ax = plt.subplots(len(items),1, figsize=(10,10)) #f

有几个相关的问题(、和),但建议的解决方案在我的案例中不起作用

我以迭代的方式创建子地块,所以我不知道每个子地块的宽度(它是在调用plt.subplot()后计算出来的),这意味着我无法在最初创建子地块时设置每个子地块的大小。 我想在创建子地块x轴后设置其大小

想象一下:

items = [A,B,C]  #this could have any number of items in it
f,ax = plt.subplots(len(items),1, figsize=(10,10)) #figsize is arbitrary and could be anything

for i in range(len(items)):
    #calculate x and y data for current item
    #calculate width of x axis for current item
    plt.sca(ax[i])
    cax = plt.gca()
    cax.plot(x,y)
    #here is where I would like to set the x axis size
    #something like cax.set_xlim(), but for the size, not the limit
注1:单位不重要,但相对大小重要,因此可以是以像素或厘米为单位的大小,甚至可以是基于相对宽度计算的比率

注2:在这种情况下,x轴的宽度与x限制无关,因此我不能仅仅设置x限制,并期望轴能够正确缩放

此外,我还试图保持代码简短,因为它将与不熟悉Python的人共享,因此如果唯一的解决方案是添加一堆行,那就不值得了,而且我将使用不正确缩放的轴。这是一种审美偏好,但不是要求。 谢谢

编辑:这是我的目标

您可以创建一个新的
GridSpec
指定
高度比
,然后更新每个
ax
s位置:

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

# create figure
f, ax = plt.subplots(3, 1, figsize=(10,10))

# plot some data
ax[0].plot([1, 2, 3])
ax[1].plot([1, 0, 1])
ax[2].plot([1, 2, 20])

# adjust subplot sizes
gs = GridSpec(3, 1, height_ratios=[5, 2, 1])
for i in range(3):
    ax[i].set_position(gs[i].get_position(f))

plt.show()

我以前也问过类似的问题。用例略有不同,但可能仍然有帮助。

当然,现在您已经得到了答案,或者这个问题已被弃用,但是如果其他人正在搜索,我使用“Bbox”解决了这个问题。这个想法是这样的:

from matplotlib.transforms import Bbox

fig, ax = plt.subplots(3,1, figsize = (11,15))
ax[0].set_position(Bbox([[0.125, 0.6579411764705883], [0.745, 0.88]]))
ax[2].set_position(Bbox([[0.125, 0.125], [0.745, 0.34705882352941175]]))

有关更多信息,请检查

您是在谈论子地块的相对大小还是绝对大小?没关系-我希望它们彼此之间的比例适当(它们是地质横截面,因此x轴大小基于地图上横截面的点A和点B之间的距离),但是,如果最简单的方法是为每一个都确定一个绝对大小,那也行。Relavtive size很简单,如@Felix的回答所示。你看到我的回答了吗?这种方法似乎需要提前知道每个子批次的相对大小。我的问题是,我不知道应该是什么大小,直到我已经在循环中。我是否误解了答案中的某些内容?答案在绘图后设置了高度比。因此,到那时你就会知道它们需要什么。这种方法的问题(如果我理解正确的话)是,你在循环之前设置gridspec比率,而我在循环内部之前不知道比率,所以我需要能够在创建轴之后修改它们。这正是使用上面的代码可以做到的。您的循环将位于“绘制一些数据”块的下方。完成后,您知道比率,创建
Gridspec
并更新现有轴的位置/大小(请参见“调整子地块大小”块)。啊,抱歉,我认为在打印之前需要设置Gridspec。所以有两个循环,一个用于绘制每个子地块,另一个用于随后更新它们。太棒了!谢谢是的,我也花了一段时间才弄到。不客气;-)啊,事实上,这是个问题。如果有一列,GridSpec可以很好地更改高度比,但是如果子地块都在同一列中,则更改宽度比不起作用-我认为它只能在每个子地块都在自己的列中时更改宽度比(