Add axes to a figure with a fixed size

吃可爱长大的小学妹 提交于 2021-01-29 08:29:20

问题


I would like to create a figure where subplots are added dynamically within a for-loop. It should be possible to define the width and height of each subplot in centimeters, that is, the more subplots are added, the bigger the figure needs to be to make room for 'incoming' subplots.

In my case, subplots should be added row-wise so that the figure has to get bigger in the y-dimension. I came across this stackoverflow post, which might lead in the right direction? Maybe also the gridspec module could solve this problem?

I tried out the code as described in the first post, but this couldn't solve my problem (it sets the final figure size, but the more subplots are added to the figure the smaller each subplot gets, as shown in this example):

import matplotlib.pyplot as plt

# set number of plots
n_subplots = 2

def set_size(w,h,ax=None):
    """ w, h: width, height in inches """
    if not ax: ax=plt.gca()
    l = ax.figure.subplotpars.left
    r = ax.figure.subplotpars.right
    t = ax.figure.subplotpars.top
    b = ax.figure.subplotpars.bottom
    figw = float(w)/(r-l)
    figh = float(h)/(t-b)
    ax.figure.set_size_inches(figw, figh)

fig = plt.figure()

for idx in range(0,n_subplots):
    ax = fig.add_subplot(n_subplots,1,idx+1)
    ax.plot([1,3,2])
    set_size(5,5,ax=ax)

plt.show()


回答1:


You're setting the same figure size (5,5) regardless of the number of subplots. If I understood your question correctly, I think you want to set the height to be proportional to the number of subplots.

However, you'd be better off to create the figure with the right size from the get-go. The code that you are providing gives the correct layout only because you know before hand how many subplots your going to create (in fig.add_subplot(n_subplots,...)). If you are trying to add subplots without knowing the total number of subplot rows you need, the problem is more complicated.

n_subplots = 4

ax_w = 5
ax_h = 5
dpi = 100

fig = plt.figure(figsize=(ax_w, ax_h), dpi=dpi)

for idx in range(0,n_subplots):
    ax = fig.add_subplot(n_subplots,1,idx+1)
    ax.plot([1,3,2])
fig.set_size_inches(ax_w,ax_h*n_subplots)
fig.tight_layout()



来源:https://stackoverflow.com/questions/64786033/add-axes-to-a-figure-with-a-fixed-size

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!