为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

智慧大石 2021-05-11 17:42:45
我经常必须创建具有固定宽度(例如,文章的列宽)并且其子图在数据坐标系中具有固定比率的图。我想手动设置宽度,并获得具有此选定宽度,子图的长宽比和适当高度的图形。示例:文章的各列的宽度为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'更新了所有字体大小?
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

给定width和subplot参数,您可以计算图形的高度。以下假设子图的宽度相等,并且只有一排子图并且它们都具有定义的外观(即不是“自动”)。


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


查看完整回答
反对 回复 2021-05-25
  • 1 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信