首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >乳胶字体样式问题--使用amsmath和sfmath进行绘图标记

乳胶字体样式问题--使用amsmath和sfmath进行绘图标记
EN

Stack Overflow用户
提问于 2014-06-22 11:37:05
回答 2查看 4.3K关注 0票数 7

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

我启用了下列软件包:

代码语言:javascript
复制
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标签。

另一种方法是在sfmath中用amsmath代替params,并确保滴答看上去像第一个图像。

谢谢

在附带说明中,这些数字是使用以下方法创建的:

代码语言:javascript
复制
fig = plt.figure()

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

plt.show()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-26 13:35:54

使用第二种方法,我们可以实现您想要的目标:使用amsmath,然后将滴答标签更改为不同的字体。这是一个黑客比这里列出的其他答案,但它最接近实现你想要的。

诀窍是使用amsmath并让Matplotlib按照通常的方式呈现所有内容,最后,用原始的sans-serif字体重新设置滴答标签。我不确定这是否完全颠覆了usetex,但如果是这样的话,就会出现TeX呈现标签和Matplotlib呈现标签的奇怪组合。看上去很棒!

重要的代码是

代码语言:javascript
复制
fontProperties = {'family':'sans-serif', 'weight': 'normal', 'size': 12}
ax1.set_xticklabels(ax1.get_xticks(), fontProperties)
ax1.set_yticklabels(ax1.get_yticks(), fontProperties)

将其添加到脚本的末尾并添加amsmath将提供以下内容:

代码语言:javascript
复制
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)

票数 8
EN

Stack Overflow用户

发布于 2014-06-25 16:25:36

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

然而,我的假设是,最初的问题是你不喜欢计算机现代字体中的滴答标签。因此,我的建议是将整个字体更改为看起来很棒的字体,用于滴答标签和轴标签。我发现Libertine就是这样一种字体。我并不100 %确定matplotlib是如何包装文本的,因此我建议定义文本和数学字体,两者很好地结合在一起。这可以通过newtx LaTeX包来实现。使用lualatex,序言可以保持相当干净,以实现我们想要的,我们使用了一个现代化的工具。根据http://matplotlib.org/users/pgf.html的说法,LuaLaTeX被官方支持通过PGF后端生成PDF数据。所以,这就是我提议的代码:

代码语言:javascript
复制
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序言中设置文本和数学字体来对字体进行绝对控制。为了让no-math设置数学字体,需要fontspec包的newtxmath选项。

制作的PDF看起来不错,这是一个截图:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24350859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档