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

设置绘图宽度并根据子图的纵横比推断高度

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

    我经常需要创建宽度固定(例如文章的列宽)且其子图在数据坐标系中具有固定比率的绘图。我想手动设置宽度,并获得一个具有所选宽度、子地块纵横比和适当高度的绘图。

    例子 :物品的柱子宽度为8.5厘米。我想创建一个包含两个子图(轴)的绘图,对于两个轴,选项 ax.set_aspect("equal") 选择1个单位 y 轴与上的一个单元具有相同的物理空间 x 轴。 我的图现在应该有8.5厘米的总宽度,但是高度应该根据Matplotlib计算,考虑到子图的纵横比以及 xlim ylim 价值观。

    我怎样才能做到这一点?

    此外,如何确保绘图中使用的字体大小与文章中使用的相同?因此,如果我的文章在11pt中设置了“Times”,那么如何在绘图中获得相同大小的字体呢?我试着用

    params = {'text.usetex': True,
              'font.size': 11,
              'font.family': 'times',
              'text.latex.unicode': True,
              }
    plt.rcParams.update(params)
    

    但例如,我的绘图中的x和y标签字体现在比文章中的要大得多。我以为“字体大小”会更新所有字体大小?

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

    您可以根据宽度和子批次参数计算图形的高度。下面假设子图的宽度相等,并且只有一行子图,并且它们都有一个定义的方面(即不是“自动”)。

    import numpy as np
    import matplotlib.pyplot as plt
    
    fig, (ax1,ax2) = plt.subplots(1,2, figsize=(8.5,8.5))
    for ax in (ax1, ax2):
        ax.set_aspect("equal")
    
    ax1.plot([1,3], [4,6], marker="o")
    ax2.plot([26,84], [64,-13], marker="s")
    
    def resize(axes):
        # this assumes a fixed aspect being set for the axes.
        for ax in axes:
            if ax.get_aspect() == "auto":
                return
            elif ax.get_aspect() == "equal":
                ax.set_aspect(1)
        fig = axes[0].figure
        s = fig.subplotpars
        n = len(axes)
        axw = fig.get_size_inches()[0]*(s.right-s.left)/(n+(n-1)*s.wspace)
        r = lambda ax: np.diff(ax.get_ylim())[0]/np.diff(ax.get_xlim())[0]*ax.get_aspect()
        a = max([r(ax) for ax in axes])
        figh = a*axw/(s.top-s.bottom)
        fig.set_size_inches(fig.get_size_inches()[0],figh)
    
    resize((ax1,ax2))
    
    plt.show()