Matplotlib 原始乳胶“\epsilon”仅产生“\varepsilon”

Matplotlib raw latex "\epsilon" only yields "\varepsilon"

我正在使用 Matplotlib 来分析结果和生成图表。我需要图例和轴标签中的希腊符号,包括 $\epsilon$。然而,生成的文本不区分 "normal" \epsilon 和 \varepsilon --- 它们都显示为 \varepsilon。这是一个最小的例子:

import numpy as np
from pylab import *
import matplotlib.pyplot as plt

t = np.arange(0.0, 1.0 + 0.01, 0.01)
s = np.cos(4 * np.pi * t) + 2

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(t, s, 'k-', linewidth=2.0, label=r'$\epsilon$, $\varepsilon$, $\phi$, $\varphi$, $\sigma$, $\varsigma$')
plt.title(r'$\epsilon$, $\varepsilon$, $\phi$, $\varphi$, $\sigma$, $\varsigma$')
plt.xlabel(r'$t [M]$')
plt.ylabel(r'$\epsilon$, $\varepsilon$, $\phi$, $\varphi$, $\sigma$, $\varsigma$')
ax.legend(ncol=2, loc='lower left', fancybox=True)
plt.show()

当我在我的 Macbook 上处理这个时(OS X El Capitan 与 Macports 安装的 TexLive 和 py27-matplotlib),一切都正确呈现 除了 \epsilon。

ETA:代码在不同的机器上做正确的事情(科学 Linux)。

默认情况下,matplotlib 使用一些相当基本的引擎来解析您的标签(不确定它到底是什么)。您可以通过在 plotting/rendering 之前添加 plt.rc('text', usetex=True) 来切换到 "normal" tex 引擎。您的脚本执行速度会慢一些,但您可以完全访问 Latex 功能。

编辑:默认使用 mathtext

您没有在脚本中使用 TeX。 Matplotlib 提供所谓的 MathText,它是 LaTeX 命令的子集,以普通 UTF8 字符呈现。这是使用默认字体集的 MathText 的样子:

您可以更改字体集,使“\varepsilon”看起来不同于“\epsilon”。但是,似乎在可用的字体集中,只有 "cm" 对这些命令具有不同的符号。

plt.rcParams["mathtext.fontset"] = "cm"

这将产生:


为了让 Latex 用于呈现您的文本,您需要专门告诉 matplotlib 这样做。一种选择是使用

plt.rcParams["text.usetex"] =True

在脚本的开头。这需要有效的 TeX 安装。
该示例将如下所示,其中“\varepsilon”和“\epsilon”确实不同。

已接受的答案正确解释了 \varepsilon\epsilon 的解释如何取决于 matplotlib 数学文本字体集。

“大局观”的原因与 epsilon 的最常见形式是 ε 这一事实有关,但 Knuth 出于某种原因决定使用 ϵ 作为 TeX 中的 \epsilon。这造成了一些混乱。在实际的希腊文本中,它们只是文体变体,而作为数学符号,它们可以有不同的含义。因此,Unicode 包括这两个符号。在希腊语部分,U+3B5 GREEK SMALL LETTER EPSILONεU+03F5 GREEK LUNATE EPSILON SYMBOLε。两者的变体也可以在 Unicode 的数学字母数字符号部分找到。

如果您在 Python 源代码中使用 Unicode 字符而不是 TeX 风格的助记符,您将得到正确的符号。

t = np.arange(0.0, 1.0 + 0.01, 0.01)
s = np.cos(4 * np.pi * t) + 2

fig = plt.figure(figsize=(4, 3))
ax = fig.add_subplot(1,1,1)
ax.plot(t, s, 'k-', linewidth=2.0, label='$ϵ$, $ε$, $ϕ$, $φ$, $σ$, $ς$')
plt.title('$ϵ$, $ε$, $ϕ$, $φ$, $σ$, $ς$')
plt.xlabel(r'$t [M]$')
plt.ylabel('$ϵ$, $ε$, $ϕ$, $φ$, $σ$, $ς$')
ax.legend(ncol=2, loc='lower left', fancybox=True)
plt.tight_layout()
plt.savefig('greek.png')