猿问

设置图的宽度并从子图的长宽比推断高度

我经常必须创建具有固定宽度(例如,文章的列宽)并且其子图在数据坐标系中具有固定比率的图。我想手动设置宽度,并获得具有此选定宽度,子图的长宽比和适当高度的图形。


示例:文章的各列的宽度为8.5厘米。我想创建一个具有两个子图(轴)的图,并且对于两个轴ax.set_aspect("equal")都选择了该选项,以便该y轴上的1个单位占用与该轴上一个单位相同的物理空间x。我的图现在应该具有8.5cm的总宽度,但是应该通过考虑子图的长宽比以及xlim和ylim值,从matplotlib中计算出高度。


我怎样才能做到这一点?


另外,如何确保图中使用的字体大小与文章中的字体大小相同?因此,如果我的文章在11pt中设置为“ times”,那么如何在情节中获得相同大小的相同字体?我尝试使用


params = {'text.usetex': True,

          'font.size': 11,

          'font.family': 'times',

          'text.latex.unicode': True,

          }

plt.rcParams.update(params)

但是例如,我的绘图中的x和y标签字体现在比文章中大得多。我以为'font.size'更新了所有字体大小?


智慧大石
浏览 188回答 1
1回答

慕标琳琳

给定width和subplot参数,您可以计算图形的高度。以下假设子图的宽度相等,并且只有一排子图并且它们都具有定义的外观(即不是“自动”)。import numpy as npimport matplotlib.pyplot as pltfig, (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()
随时随地看视频慕课网APP

相关分类

Python
我要回答