【问题标题】:Matplotlib raw latex "\epsilon" only yields "\varepsilon"Matplotlib 原始乳胶 "\epsilon" 只产生 "\varepsilon"
【发布时间】:2017-09-30 05:10:41
【问题描述】:

我正在使用 Matplotlib 来分析结果并生成数据。我需要图例和轴标签中的希腊符号,包括 $\epsilon$。然而,生成的文本不区分“正常”\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)上做正确的事。

【问题讨论】:

    标签: python matplotlib latex macports


    【解决方案1】:

    接受的答案正确解释了\varepsilon\epsilon 的解释如何取决于matplotlib mathtext 字体集。

    “大局观”的原因与 epsilon 最常见的形式是 ε 的事实有关,但 Knuth 出于某种原因决定使用 ε 作为\epsilon 在 TeX 中。这造成了一些混乱。在实际的希腊文本中,它们只是文体变体,而作为数学符号,它们可以具有不同的含义。因此,Unicode 包括这两个符号。在希腊语部分,U+3B5 希腊小写字母 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')
    

    【讨论】:

      【解决方案2】:

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

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

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

      这将产生:


      为了让 Latex 用于呈现您的文本,您需要专门告诉 matplotlib 这样做。一种选择是使用
      plt.rcParams["text.usetex"] =True
      

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

      【讨论】:

      • 谢谢!我总是有一个工作的 LaTeX 安装,所以我没有想到这里没有被访问。奇怪的是,MathText 对 \epsilon 有这个小怪癖,但它适用于其他具有不同形式的希腊字母。
      • 你是对的,还有在 MathText 中使用 \varepsilon 的选项。您需要选择不同的字体集。我更新了答案。
      • 顺便说一句,您链接到的 MathText 页面仍然 声称 \epsilon 可用(与 \varepsilon 不同)。因此,失败似乎在于 MathText 是如何尝试实现它的,而它在我的 Macbook 上使用的字体系列失败了。我在 matplotlob 用户列表存档中找到了这个,有人建议在用户的 matplotlibrc 文件中切换 font.sans(对我不起作用):matplotlib.1069221.n5.nabble.com/… ETA:你在编辑的评论中解决了这个问题。我可能会尝试“cm”而不是我找到的存档讨论中建议的 DejaVu Sans。
      • 所以你的意思是["mathtext.fontset"] = "cm" 在mac 上不起作用?真遗憾。在这种情况下,您可能需要使用真正的 Latex。
      • 对不起,我不清楚。没有奏效的是我尝试使用“Deja Vu Sans”,这是我在旧邮件列表讨论中找到的建议。然而,“cm”确实工作,而且肯定比等待整个 TeX 编译要快。
      【解决方案3】:

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

      编辑:默认使用mathtext

      【讨论】:

        猜你喜欢
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        • 2019-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多