代码之家  ›  专栏  ›  技术社区  ›  Gilfoyle

Matplotlib:子批次居中

  •  0
  • Gilfoyle  · 技术社区  · 6 年前

    这是我的密码

    导入matplotlib.pyplot as plt 将numpy导入为np 步骤=20 图=plt.图()) 对于范围(步数)中的k: ax=图添加_子批次(1,步骤,(k+1))。 ax.imshow(np.random.rand(30,30),interpolation=“none”,cmap=“gray”)。 轴(“关闭”) 图紧密布局 请调整子批次(右=0.97,,\ 左= 0.03,\ 底部=0.03, 顶部=0.97, WSPACE=0.1, HSPACE=0.1) plt.savefig(“test.png”,dpi=300,bbox_inches=“tight”)。 关闭(图) < /代码>

    产生以下输出:

    但我真的很想拥有这样的东西:

    仅突出显示的部分。居中,子批次周围没有太多空白。

    我有两个问题,我不能解决与其他类似的帖子,关于我在互联网上发现的子程序。如何使绘图水平和垂直居中?是什么导致情节不集中?这可能是由 plt.subflots_adjust()引起的,我也不太明白。调整这些值有时会导致非必然的结果(在我看来)。如何自动调整 子批次的值,以便对于任意数量的子批次,所有内容都居中,周围没有太多空白?

    产生以下输出:

    enter image description here

    但我真的很想拥有这样的东西: enter image description here

    仅突出显示的部分。居中,子图周围没有太多空白。

    我有两个问题,我不能解决与其他类似的帖子,关于我在互联网上发现的子程序。如何使绘图水平和垂直居中?是什么导致情节不集中?这可能是由于 plt.subplots_adjust() 我也不太明白。调整这些值有时会导致非必然的结果(在我看来)。我如何调整 subplots_adjust 自动地,对于任意数量的子块,所有东西都是居中的,周围没有太多的空白?

    1 回复  |  直到 6 年前
        1
  •  1
  •   ImportanceOfBeingErnest    6 年前

    bbox_inches=“tight” automatically trys to“guess”how much to crop from the figure.如果您想完全控制定位,这可能会导致不希望的结果。

    现在的主要目标是首先获得所需大小的数字。

    对于粗略估计,数字高度需要为1/步加上一些空白处。例如

    steps=20
    Fig=plt.Fig(FigSize=(12,(12+3)/步骤)
    < /代码> 
    
    

    结果不错

    导入matplotlib.pyplot as plt 将numpy导入为np 步骤=20 Fig=plt.Fig(FigSize=(12,(12+3)/步骤) 对于范围(步数)中的k: ax=图添加_子批次(1,步骤,(k+1))。 ax.imshow(np.random.rand(30,30),interpolation=“none”,cmap=“gray”)。 轴(“关闭”) 请调整子批次(右=0.97,,\ 左= 0.03,\ 底部=0.03, 顶部=0.97, WSPACE=0.1, HSPACE=0.1) plt.savefig(“test.png”,dpi=300,facecolor=“palegreen”)。 显示() 关闭(图) < /代码>

    当然,您可以调整图形大小和子批次参数以精确匹配。例如,您从给定的图形宽度开始,并从中计算图形高度,同时考虑所有子地块参数和图像的方面(在此处更改以使其效果更清晰)。

    导入matplotlib.pyplot as plt 将numpy导入为np 步骤=20 #子批次参数 sp=dict(右=0.98,)\ 左侧=0.02, 底部=0.1, 顶部=0.9, WSPACE=0.1, HSPACE=0.1) 图W=12英寸 纵横比=30/50图像的纵横比(高/宽) axs=(Figw*(sp[“right”]-sp[“left”])/(steps+(steps-1)*sp[“wspace”]) 图H=axs*宽高比/(sp[“top”]-sp[“bottom”]) Fig=Plt.Fig(FigSize=(FigW,FigH))。 对于范围(步数)中的k: ax=图添加_子批次(1,步骤,(k+1))。 ax.imshow(np.random.rand(30,50),interpolation=“none”,cmap=“gray”)。 轴(“关闭”) plt.子批次调整(*sp) plt.savefig(“test.png”,dpi=300,facecolor=“palegreen”)。 显示() 关闭(图) < /代码>

    完全控制定位。

    现在的主要目标是首先得到所需大小的数字。

    对于粗略估计,数字高度需要为1/步加上一些空白处。例如。

    steps = 20
    fig = plt.figure(figsize=(12,(12+3)/steps))
    

    结果不错

    import matplotlib.pyplot as plt
    import numpy as np
    
    steps = 20
    fig = plt.figure(figsize=(12,(12+3)/steps))
    for k in range(steps):
        ax = fig.add_subplot(1,steps,(k+1))
        ax.imshow(np.random.rand(30,30), interpolation="none", cmap="gray")
        ax.axis("off")
    
    plt.subplots_adjust(right=0.97,\
                        left=0.03,\
                        bottom=0.03,\
                        top=0.97,\
                        wspace=0.1,\
                        hspace=0.1)
    plt.savefig("test.png", dpi=300, facecolor="palegreen")
    plt.show()
    plt.close(fig)
    

    enter image description here

    当然,您可以调整图形大小和子批次参数以精确匹配。例如,您从给定的图形宽度开始,然后从中计算图形高度,同时考虑到所有子地块参数和图像的方面(在此处更改以使其效果更清晰)。

    import matplotlib.pyplot as plt
    import numpy as np
    
    steps = 20
    
    # subplot parameters
    sp = dict(right=0.98,\
              left=0.02,\
              bottom=0.1,\
              top=0.9,\
              wspace=0.1,\
              hspace=0.1)
    figw = 12 #inches
    aspect = 30/50 # aspect of the images (heigth/width)
    axs = (figw*(sp["right"]-sp["left"]))/(steps+(steps-1)*sp["wspace"])
    figh = axs*aspect/(sp["top"]-sp["bottom"])
    
    fig = plt.figure(figsize=(figw, figh))
    
    for k in range(steps):
        ax = fig.add_subplot(1,steps,(k+1))
        ax.imshow(np.random.rand(30,50), interpolation="none", cmap="gray")
        ax.axis("off")
    
    plt.subplots_adjust(**sp)
    plt.savefig("test.png", dpi=300, facecolor="palegreen")
    plt.show()
    plt.close(fig)
    

    enter image description here