文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。
编写数学表达式
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$") # 推荐写法
另请参见:数学文本示例
使用 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
虽然 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=0∑∞xi
分数、二项式与堆叠数字
用 \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} 45−x1
给分数加括号时要当心:直接写会得到过小的括号:
r'$(\frac{5 - \frac{1}{x}}{4})$'
( 5 − 1 x 4 ) (\frac{5 - \frac{1}{x}}{4}) (45−x1)
解决方法是给括号加 \left
和 \right
,让解析器知道要包围整个对象:
r'$\left(\frac{5 - \frac{1}{x}}{4}\right)$'
( 5 − 1 x 4 ) \left(\frac{5 - \frac{1}{x}}{4}\right) (45−x1)
根式
用 \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 SansR ∏ 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 SerifR ∏ 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
)设置为 cm
、stix
或 stixsans
,这样当自定义字体中找不到特定字符时,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 a | KaTeX parse error: Undefined control sequence: \dddot at position 1: \̲d̲d̲d̲o̲t̲ ̲a |
\ddddot a | KaTeX 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
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。