Matplotlib 全面使用指南 -- 编写数学表达式 Writing mathematical expressions

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。

Matplotlib

编写数学表达式

Matplotlib 内置了一个轻量级的 TeX 表达式解析器和排版引擎,Mathtext 就是该引擎支持的 TeX 标记子集。如果 rcParams["text.usetex"](默认值:False)设为 True,Matplotlib 也可以直接通过 TeX 渲染所有文本;详见「使用 LaTeX 渲染文本」。当 rcParams["text.usetex"]False(默认)时,Mathtext 功能可用。

只要把字符串放在一对美元符号 '$' 之间,就能被解析为 Mathtext。
Mathtext 经常包含大量反斜杠 '\';为避免手动转义,通常使用原始字符串书写 Mathtext。例如:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(3, 3), linewidth=1, edgecolor='black')
fig.text(.2, .7, "plain text: alpha > beta")                    # 普通文本
fig.text(.2, .5, "Mathtext: $\\alpha > \\beta$")               # 需要双重转义
fig.text(.2, .3, r"raw string Mathtext: $\alpha > \beta$")     # 推荐写法

img

另请参见:数学文本示例

使用 Mathtext 无需安装 TeX,因为 Matplotlib 自带解析与排版引擎。Mathtext 的排版算法基本直接复刻了 Donald Knuth 的 TeX。若想用其他 TeX 引擎渲染数学文本,参见 使用 LaTeX 渲染文本

注意

若要在文档的 HTML 输出中与 mathtext 渲染结果完全一致,请使用 matplotlib.sphinxext.mathmpl Sphinx 扩展。

特殊字符

Mathtext 必须放在一对美元符号 '$' 之间。如果字符串里真的需要美元符号 '$',需要写成 '\$'。一个字符串里可以出现多对美元符号,从而渲染多个 Mathtext 表达式。美元符号出现奇数次时,整段文字仅作普通文本渲染。

fig = plt.figure(figsize=(3, 3), linewidth=1, edgecolor='black')
fig.suptitle("Number of unescaped $")
fig.text(.1, .7, r"odd: $ \alpha $ = $1")           # 美元符号共 3 个,普通文本
fig.text(.1, .5, r"even: $ \beta $= $ 2 $")         # 美元符号共 4 个,两段 Mathtext
fig.text(.1, .3, r'odd: $ \gamma $= \$3 $')         # 3 个,普通文本
fig.text(.1, .1, r'even: $ \delta $ = $ \$4 $')     # 4 个,两段 Mathtext

img

虽然 Mathtext 力求与普通 TeX 兼容,但在何时需要转义特殊字符方面有所不同。在 TeX 中,美元符号在非数学模式下必须写成 '\$';在 Matplotlib 中,只要出现 Mathtext 就需要转义美元符号。

下面列出的符号在 TeX 的非数学模式下都必须转义,而在 Matplotlib 中是否需要转义取决于 rcParams["text.usetex"] 的设置:

# $ % & ~ _ ^ \ { } \( \) $$ $$

详见 usetex 教程

下标与上标

使用 '_''^' 表示下标和上标:

α i > β i \alpha_i > \beta_i αi>βi

如果下标或上标包含多个字母,请用花括号 {...} 括起来:

r'$\alpha^{ic} > \beta_{ic}$'

α i c > β i c \alpha^{ic} > \beta_{ic} αic>βic

某些符号会自动将上下标放在正下方或正上方。
例如,求和符号从 0 到 ∞ 可以这样写:

r'$\sum_{i=0}^\infty x_i$'

∑ i = 0 ∞ x i \sum_{i=0}^\infty x_i i=0xi

分数、二项式与堆叠数字

\frac{}{}\binom{}{}\genfrac{}{}{}{}{}{} 分别生成分数、二项式和堆叠数字:

r'$\frac{3}{4} \binom{3}{4} \genfrac{}{}{0}{}{3}{4}$'

3 4 ( 3 4 ) 3 4 \frac{3}{4} \binom{3}{4} \genfrac{}{}{0pt}{}{3}{4} 43(43)43

分数可以任意嵌套:

r'$\frac{5 - \frac{1}{x}}{4}$'

5 − 1 x 4 \frac{5 - \frac{1}{x}}{4} 45x1

给分数加括号时要当心:直接写会得到过小的括号:

r'$(\frac{5 - \frac{1}{x}}{4})$'

( 5 − 1 x 4 ) (\frac{5 - \frac{1}{x}}{4}) (45x1)

解决方法是给括号加 \left\right,让解析器知道要包围整个对象:

r'$\left(\frac{5 - \frac{1}{x}}{4}\right)$'

( 5 − 1 x 4 ) \left(\frac{5 - \frac{1}{x}}{4}\right) (45x1)

根式

\sqrt[]{} 生成根式。例如:

2 \sqrt{2} 2

可以在方括号中指定根指数(必须是简单表达式,不能含分数或上下标):

x 3 \sqrt[3]{x} 3x

字体

数学符号默认使用 斜体

可通过 rcParams["mathtext.default"](默认:'it')修改默认值。例如设为 'regular' 可以让数学文本与正文字体一致。

要改变字体,例如把 “sin” 写成罗马体,可用字体命令:

r'$s(t) = \mathcal{A}\mathrm{sin}(2 \omega t)$'

s ( t ) = A s i n ( 2 ω t ) s(t) = \mathcal{A}\mathrm{sin}(2 \omega t) s(t)=Asin(2ωt)

更简单地,许多常用函数名自带罗马体快捷方式,因此可写成:

r'$s(t) = \mathcal{A}\sin(2 \omega t)$'

s ( t ) = A sin ⁡ ( 2 ω t ) s(t) = \mathcal{A}\sin(2 \omega t) s(t)=Asin(2ωt)

其中 “s” 和 “t” 为斜体变量, “sin” 为罗马体,振幅 “A” 为花体。
如果花体 A 与 sin 挨得太近,可用间距命令增加空隙:

r's(t) = \mathcal{A}\/\sin(2 \omega t)'

s ( t ) = A   sin ⁡ ( 2 ω t ) s(t) = \mathcal{A}\,\sin(2 \omega t) s(t)=Asin(2ωt)

Mathtext 可选字体包括 DejaVu Sans(默认)、DejaVu Serif、TeX 的 Computer Modern、与 Times 融合的 STIX 字体,或用户指定的 Unicode 字体。通过 rcParams["mathtext.fontset"](默认:'dejavusans')设置。

所有字体均支持的选项:

命令结果
\mathrm{Roman} R o m a n \mathrm{Roman} Roman
\mathit{Italic} I t a l i c \mathit{Italic} Italic
\mathtt{Typewriter} T y p e w r i t e r \mathtt{Typewriter} Typewriter
\mathcal{CALLIGRAPHY} C A L L I G R A P H Y \mathcal{CALLIGRAPHY} CALLIGRAPHY

使用 STIX 字体时,还可额外选择:

以下是提取的表格内容,说明部分已翻译:

命令结果
\mathbb{blackboard} b l a c k b o a r d \mathbb{blackboard} blackboard
\mathrm{\mathbb{blackboard}} b l a c k b o a r d \mathrm{\mathbb{blackboard}} blackboard
\mathfrak{Fraktur} F r a k t u r \mathfrak{Fraktur} Fraktur
\mathsf{sansserif} s a n s s e r i f \mathsf{sansserif} sansserif
\mathrm{\mathsf{sansserif}} s a n s s e r i f \mathrm{\mathsf{sansserif}} sansserif
\mathbf{bolditalic} b o l d i t a l i c \mathbf{bolditalic} bolditalic

另有五种全局「字体集」可选,通过 matplotlibrc 中的 mathtext.fontset 参数设定:

  • dejavusans:DejaVu Sans

    R ∏ i = α ∞ a i sin ⁡ ( 2 π f x i ) \mathcal{R} \prod_{i=\alpha}^{\infty} a_i \sin\left(2\pi fx_i\right) Ri=αaisin(2πfxi)

  • dejavuserif:DejaVu Serif

    R ∏ i = α ∞ a i sin ⁡ ( 2 π f x i ) \mathcal{R} \prod_{i=\alpha}^{\infty} a_i \sin\left(2\pi fx_i\right) Ri=αaisin(2πfxi)

  • cm:Computer Modern(TeX)

    R ∏ i = α ∞ a i sin ⁡ ( 2 π f x i ) \mathcal{R} \prod_{i=\alpha}^{\infty} a_i \sin\left(2\pi fx_i\right) Ri=αaisin(2πfxi)

  • stix:STIX(与 Times 融合)

    R ∏ i = α ∞ a i sin ⁡ ( 2 π f x i ) \mathcal{R} \prod_{i=\alpha}^{\infty} a_i \sin\left(2\pi fx_i\right) Ri=αaisin(2πfxi)

  • stixsans:STIX 无衬线

    R ∏ i = α ∞ a i sin ⁡ ( 2 π f x i ) \mathcal{R} \prod_{i=\alpha}^{\infty} a_i \sin\left(2\pi fx_i\right) Ri=αaisin(2πfxi)

此外,可用 \mathdefault{...} 或其别名 \mathregular{...} 让数学文本使用普通文本字体。此方式限制较多(可用符号少),但能让数学表达式与图中其他文字更统一。

为兼容常用宏包,\text{...} 也可用,其字体等同于 \mathrm{...},但保留空格并把 - 渲染为短横线(而非减号)。

自定义字体

Mathtext 还支持用自定义字体渲染数学符号。该方法较为复杂,仅推荐给耐心用户作为实验功能。把 rcParams["mathtext.fontset"] 设为 'custom' 后,可再设置以下参数,为特定数学字符集指定字体文件:

参数说明
mathtext.it\mathit{} 或默认斜体
mathtext.rm\mathrm{} 罗马体(直立)
mathtext.tt\mathtt{} 打字机字体(等宽)
mathtext.bf\mathbf{} 粗体
mathtext.bfit\mathbfit{} 粗斜体
mathtext.cal\mathcal{} 花体
mathtext.sf\mathsf{} 无衬线体

每个参数都应设置为 fontconfig 字体描述符,如 Matplotlib 中的字体所定义。使用的字体应具有 Unicode 映射,以便找到非拉丁字符,如希腊文。如果想使用自定义字体中不包含的数学符号,可以将 rcParams["mathtext.fallback"](默认值:cm)设置为 cmstixstixsans,这样当自定义字体中找不到特定字符时,Mathtext 系统就会使用其他字体中的字符。

注意 Unicode 中的数学字形随时间演变,许多字体可能未在正确位置放置所需字形。

重音符号

在任意符号前加重音命令即可在其顶部加重音。部分命令有长、短两种形式。
此外还有两种特殊重音,可自动根据下方符号宽度调整:

命令结果
\acute a a ˊ \acute a aˊ
\bar a a ˉ \bar a aˉ
\breve a a ˘ \breve a a˘
\dot a a ˙ \dot a a˙
\ddot a a ¨ \ddot a a¨
\dddot aKaTeX parse error: Undefined control sequence: \dddot at position 1: \̲d̲d̲d̲o̲t̲ ̲a
\ddddot aKaTeX parse error: Undefined control sequence: \ddddot at position 1: \̲d̲d̲d̲d̲o̲t̲ ̲a
\grave a a ˋ \grave a aˋ
\hat a a ^ \hat a a^
\tilde a a ~ \tilde a a~
\vec a a ⃗ \vec a a
\overline{abc} a b c ‾ \overline{abc} abc

给小写 i、j 加重音时需小心。为避免 i 上的点与重音冲突,可使用 \imath

命令结果
\widehat{xyz} x y z ^ \widehat{xyz} xyz
\widetilde{xyz} x y z ~ \widetilde{xyz} xyz
r"$\hat i\ \ \hat \imath$"

i ^    ı ^ \hat i\ \ \hat \imath i^  ^

符号

可使用大量 TeX 符号,如 \infty\leftarrow\sum\int 等。

  • 小写希腊字母
  • 大写希腊字母
  • 希伯来字母
  • 拉丁命名字符
  • 分隔符
  • 大型符号
  • 标准函数名
  • 二元运算符
  • 关系符号
  • 箭头符号
  • 点符号
  • 黑板粗体字符
  • 手写体字符
  • 哥特体字符
  • 杂项符号

如果某个符号没有名称(如 STIX 字体中的许多生僻符号),也可以使用 Unicode 字符:

r'$\u23ce$'

Download Jupyter notebook: mathtext.ipynb

Download Python source code: mathtext.py

Download zipped: mathtext.zip

风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

船长Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值