7

我有一个我认为会发生更多的问题。但是,在互联网上搜索了一段时间后,我一直无法找到解决问题的方法。所以这里是:

对于使用 matplotlib.pyplot 创建的绘图,我想将 SI 单位千分尺合并到我的 xlabel 中。然而,单位微米需要是直立的。经过一番摆弄后,我实现了所需的 xlabel。

我必须生成的代码是:

import matplotlib
import matplotlib.pyplot as plt

matplotlib.rc('text', usetex = True)
params = {'text.latex.preamble': [r'\usepackage{siunitx}', r'\usepackage{cmbright}']}
plt.rcParams.update(params)


fig = plt.figure()
ax = fig.add_subplot(1,1,1)

ax.set_xlabel('$\si{\micro \meter}$', fontsize = 16)
ax.set_ylabel("hi", fontsize = 16)

plt.savefig("test.png")

结果如下所示: 在此处输入图像描述 千分尺正是我想要的。然而问题是 x 和 y 刻度的字体被改变了。这是因为:

matplotlib.rc('text', usetex = True)

如何将字体值重置为其原始值?或者我如何确保在引入 tex 时字体不会改变?

作为参考,我所指的原始值如下所示: 在此处输入图像描述 除了尝试将字体恢复为原始值之外,我还尝试了将微米合并到我的 xlabel 中的不同方法。这里出现的问题是它仍然是斜体或者它具有粗体设置。我正在寻找的千分尺是第一个图中给出的那个。

我希望有人能帮我解决这个问题。

提前感谢

4

3 回答 3

3

对我有用的不是usetex使用 Unicode,而是使用 Unicode:

ax.set_xlabel(u'\u03bc')

将标签设置为单个直立mu

这需要在加载时进行以下设置matplotlib

import matplotlib
matplotlib.rcParams['mathtext.fontset'] = 'cm'
matplotlib.rc('font', family='serif', serif='CMU Serif')
import matplotlib.pyplot as plt

在这里,我使用了 Sourceforge 的“Computer Modern Unicode”字体(如果您想与在 LaTeX 中编写排版及其默认的 Computer Modern 字体保持一致,强烈推荐)。

但是任何带有mu字形的 unicode 字体都应该可以工作。实际上,CMU Serif的mu在美学上不如 SIunitx 的mu,但它是正确的。

需要重新启动 Python 才能生效。

于 2017-08-03T11:04:28.143 回答
2

我也在努力解决这样的问题,即当 text.usetex = True 时,让刻度标签和轴标签保持一致。我设法找到的解决方案并不理想,但它目前有效。

您需要做的是将字体系列设置为“sans-serif”,并添加一个使用 sans-serif 数学字体的乳胶包(sfmath - 确保它在您的 tex 路径中!)

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}', r'\sisetup{detect-family = true}',
    r'\usepackage{amsmath}']}   
plt.rcParams.update(params)   

fig = plt.figure(figsize = (4,4))
ax = fig.add_subplot(1,1,1)
ax.set_xlabel('$\si{\um} detection$')
ax.set_ylabel(r"$\mu \boldsymbol{\mu}$")
plt.show()                              

此外,我必须告诉 siunitx 包来检测字体系列,并且我还必须在 x-label 中添加一些额外的文本才能使检测真正起作用(您可以稍后删除此文本,标签仍然会之后工作)。

对我来说,这会导致: 在此处输入图像描述 更一般地说,我有以下我的 ~/.matplotlib/matploblibrc 文件,用于衬线字体:

font.family    : serif 
text.latex.preamble    :   \usepackage{mathptmx}

对于无衬线字体:

font.family : sans-serif 
text.latex.preamble :   \usepackage{sfmath}
于 2014-03-13T10:59:26.257 回答
0

我有同样的问题,这解决了它:

在您的matplotlibrc文件更改中

mathtext.default : it

mathtext.default : regular
于 2017-12-13T22:12:54.340 回答