【问题标题】:Latex font style issues using amsmath and sfmath for plot labeling使用 amsmath 和 sfmath 进行绘图标签的乳胶字体样式问题
【发布时间】:2014-06-22 11:37:05
【问题描述】:

我有一个关于在 python 中使用 TeX 的问题。

我启用了以下软件包:

import numpy
import matplotlib
import matplotlib.pyplot as plt

matplotlib.rc('text', usetex = True)
matplotlib.rc('font', **{'family' : "sans-serif"})
params = {'text.latex.preamble' : [r'\usepackage{siunitx}', r'\usepackage{sfmath}']}
plt.rcParams.update(params)

可以在我的previous question 中查找原因。

不过,我现在也可以使用amsmath 包的字体了。当我将它包含在参数中时,它没有响应。我所需要的只是amsmath 用“a”标记绘图的 x 轴。

所以要告诉你我有什么:

以及我想要的(关于 x 标签):

请注意,为了生成第二张图片,我将sfmath 更改为amsmath。这立即弄乱了 x 和 y 刻度。这是我不想发生的事情。

是否可以将单个字母/单词的字体样式更改为amsmath 的字体样式?这样我就可以在指示我的图形的 x-label 时只使用该字体样式。

另一种方法是在params 中将sfmath 替换为amsmath,并确保刻度看起来像第一张图片。

谢谢

顺便说一句,这些数字是使用以下方法创建的:

fig = plt.figure()

ax1 = fig.add_subplot(1, 1, 1)
ax1.set_xlabel(r"$a$", fontsize = 14)

plt.show()

【问题讨论】:

  • 我明白你的问题,但为了激励我们为你找到解决方案:第二张图片中的刻度有什么问题?
  • 在这种情况下,错误可能有点太强了。我不介意字体。问题是因为usetex = True,所有的刻度都是TeX。这会使蜱变细。在不增加它们的大小的情况下,如果它们稍微大胆一点,我会接受它们。
  • 我在下面添加了一个new answer,它似乎可以满足您的需求。如果这不是您要查找的内容,您能否添加评论,说明看起来有什么问题?

标签: python matplotlib latex tex


【解决方案1】:

使用第二种方法,我们可以准确地实现您正在寻找的内容:使用amsmath,然后将刻度标签更改为不同的字体。与此处列出的其他答案相比,这更像是一种 hack,但它最接近您想要的。

诀窍是使用amsmath 并让 Matplotlib 像往常一样渲染所有内容,然后在最后使用原始无衬线字体重置刻度标签。我不确定这是否完全颠覆了usetex,但如果确实如此,那么你就有了 TeX 渲染标签和 Matplotlib 渲染标签的奇怪组合。看起来很棒!

重要的一段代码是

fontProperties = {'family':'sans-serif', 'weight': 'normal', 'size': 12}
ax1.set_xticklabels(ax1.get_xticks(), fontProperties)
ax1.set_yticklabels(ax1.get_yticks(), fontProperties)

将此添加到脚本的末尾并添加 amsmath 会得到以下结果:

import numpy
import matplotlib
import matplotlib.pyplot as plt

matplotlib.rc('text', usetex = True)
matplotlib.rc('font', **{'family' : "sans-serif"})
params = {'text.latex.preamble' : [r'\usepackage{siunitx}', r'\usepackage{amsmath}']}
plt.rcParams.update(params)

fig = plt.figure(figsize=(8,6))
ax1 = fig.add_subplot(1, 1, 1)
ax1.set_xlabel(r"$a$", fontsize = 14)

fontProperties = {'family':'sans-serif', 'weight': 'normal', 'size': 12}
ax1.set_xticklabels(ax1.get_xticks(), fontProperties)
ax1.set_yticklabels(ax1.get_yticks(), fontProperties)

【讨论】:

  • 但是如何安装呢?
【解决方案2】:

sfmath 包有一个选项mathitOrig,它保留了用于斜体数学的原始字体(这是 LaTeX 中的大多数数学)。将此选项与 $\mathit{a}$ 一起使用可以让您获得接近您想要的东西,尽管它并不完美,因为数学字体与 amsmath 字体不太一样。

import numpy
import matplotlib
import matplotlib.pyplot as plt

matplotlib.rc('text', usetex = True)
matplotlib.rc('font', **{'family' : "sans-serif"})
params = {'text.latex.preamble' : [r'\usepackage{siunitx}', r'\usepackage[mathitOrig]{sfmath}']}
plt.rcParams.update(params)

fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1)
ax1.set_xlabel(r"$\mathit{a}$", fontsize = 14)

【讨论】:

  • 感谢您的回答。我知道mathitOrig 并且一直在玩它。还有其他选项sfmath 有。但是,它们都没有产生我需要的“a”。
【解决方案3】:

我认为 not 放入 $ ... $ 的所有内容都呈现为普通文本。然后我们可以单独定义一个文本字体和一个数学字体。但是,刻度标签受 LaTeX 数学字体的影响,如您的问题中所示。这很奇怪,matplotlib 以某种方式将所有刻度标签包装在数学环境中。因此,这里的基本挑战是刻度标签和轴标签使用相同的字体呈现。现在,我们可以通过使用多个数学字母来解决这个问题。然后,您将不得不在整个地方使用类似\mathrm{} 的东西。

但是,我的假设是最初的问题是您不喜欢 Computer Modern 字体中的刻度标签。因此,我的建议是将整体字体更改为看起来不错的字体,用于刻度标签和轴标签。我发现 Linux Libertine 就是这样一种字体。我不是 100% 确定 matplotlib 如何包装文本,因此我建议定义文本和数学字体,两者都很好地结合在一起。这可以通过newtx LaTeX 包来实现。使用lualatex,序言可以保持非常干净以实现我们想要的,并且我们使用现代工具。根据http://matplotlib.org/users/pgf.html,官方支持 LuaLaTeX 通过 PGF 后端生成 PDF 图形。所以,这是我建议的代码:

import matplotlib as mpl
mpl.use('pgf')
import matplotlib.pyplot as plt

pgf_with_lualatex = {
    "text.usetex": True,
    "pgf.rcfonts": False,   # Do not set up fonts from rc parameters.
    "pgf.texsystem": "lualatex",
    "pgf.preamble": [
        r'\usepackage[libertine]{newtxmath}',
        r'\usepackage[no-math]{fontspec}',
        r'\usepackage{libertine}',
        ]
}
mpl.rcParams.update(pgf_with_lualatex)

fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1)
ax1.set_xlabel("$a b c$", fontsize = 14)
plt.savefig('figure.pdf')

我们通过将rcfonts 设置为False 以及在LaTeX 序言中设置文本和数学字体来对字体进行绝对控制。需要fontspec 包的no-math 选项才能让newtxmath 设置数学字体。

生成的PDF看起来不错,这是截图:

【讨论】:

  • 感谢您的回答。如果我使用您的代码并将生成的图像与第二张图像(使用amsmath 创建)进行比较,则刻度是相同的。有没有办法让它们更大胆?
  • 刻度不相同。在您的第二张图片中,它们是使用 Computer Modern 字体排版的,在我的图片中,它们是 Libertine。
猜你喜欢
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2011-03-04
相关资源
最近更新 更多