Matplotlib mathtext中\left与\right括号搭配上标时无法正确渲染的问题
太懂这种糟心的情况了——本来想靠\left[和\right]让Matplotlib自动适配方括号的高度,结果上标直接“跑”到括号外面,明明括号比普通的大了点,但就是罩不住上标,真的离谱😂
先给你同步下我对问题的理解:你用了这段最小复现代码:
import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111) ax.set_xlabel(r'Area $\left[ \mathrm{cm}^{2}\right]$') plt.savefig('figure.png')
运行后生成的图里,x轴标签的方括号没能完全包住cm²的上标部分;你也提到了,要是标签里带分数,或者上标嵌套在更复杂的结构里,\left[/\right]反而能正常缩放括号(虽然也不是完美),偏偏这种简单的单位上标场景掉链子,你还不想切换到完整的LaTeX渲染,最后推测这是个bug,我完全认同——这大概率是Matplotlib内置mathtext对简单上标的高度计算出了问题。
下面给你几个不用切换LaTeX就能解决的实用办法:
手动指定固定大小的括号:放弃自动缩放,直接用
\bigg[/\bigg]这类预设高度的括号,大小刚好能盖住²这种上标。修改后的标签代码如下:ax.set_xlabel(r'Area $\bigg[ \mathrm{cm}^{2}\bigg]$')你还可以根据实际需求换成
\big[(稍小)或者\Bigg[(更大),总能找到适配的尺寸。用
\mathstrut给括号“打补丁”:\mathstrut是个看不见的占位符,它的高度和深度和标准数学字符一致,能让\left[/\right]误以为需要更大的渲染高度。把标签改成这样就能解决:ax.set_xlabel(r'Area $\left[ \mathrm{cm}^{2}\mathstrut\right]$')加了
\mathstrut之后,\left[会自动放大到完全包住上标的高度,完美适配你的需求。万不得已的备用方案:切换到LaTeX渲染:虽然你明确不想用,但如果上面的方法都没效果,可以试试在代码开头加上这行开启完整LaTeX渲染:
plt.rcParams['text.usetex'] = True不过这需要你的系统已经安装了LaTeX环境,属于“大材小用”的备用选项。
你说这大概率是个bug,我也完全赞同——mathtext对这种简单上标的高度计算确实存在疏漏,你可以去Matplotlib的GitHub仓库搜搜有没有类似的issue,或者提一个新的,说不定后续版本就会修复这个问题~
备注:内容来源于stack exchange,提问作者chubnub_

