Matplotlib迭代设置子图轴大小

时间:2018-11-28 14:31:23

标签: python matplotlib scaling subplot axes

有几个相关的问题(hereherehere),但是建议的解决方案不适用于我的情况。

我正在迭代创建子图,所以我不提前知道每个子图的宽度(它是在调用plt.subplots()之后进行计算的),这意味着我无法设置每个子图的大小当我最初创建它们时。 在创建子图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的人共享的,因此,如果唯一的解决方案涉及添加许多行,那是不值得的,并且我会忍受缩放比例不正确的情况轴。这是审美偏好,但不是必需的。 谢谢!

编辑:这是我的目标 desired subplots

2 个答案:

答案 0 :(得分:2)

现在肯定可以找到答案,或者不建议使用此问题,但是如果有人在搜索,我可以使用“ 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]]))

有关更多信息,请选中https://matplotlib.org/api/transformations.html#matplotlib.transforms.Bbox

答案 1 :(得分:1)

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

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

我在here之前问过类似的问题。用例略有不同,但可能仍会有所帮助。