如何在 Python/matplotlib 中使用 \siunitx 包?

如何在 Python/matplotlib 中使用 \siunitx 包?

我正在编写一个 LaTeX 文档,并matplotlib在其中包含一些图表,.pgf格式为\include{file.pgf}。与将matplotlib图表导出到.pdf.eps格式相比,它的优点在于字体与我的文档中的字体相匹配,可能还有其他优点,但这不是主要问题。

在我的 LaTeX 文档中,我使用了siunitx包,我也想用它来绘制matplotlib图表。例如,某些轴可能是以米为单位的距离,所以我想使用Distance (\si{\meter})而不是Distance (m)

通过对 Python 文件中的大量 Google 研究.py,我得出了以下示例:

import matplotlib as mpl
mpl.use('pgf')
mplparams = {"pgf.rcfonts": False}
mpl.rc('text', usetex=True)
mpl.rcParams.update(mplparams)
import matplotlib.pyplot as plt
plt.rc('text', usetex=True) 
if "siunitx" not in plt.rcParams["text.latex.preamble"]:
    plt.rcParams["text.latex.preamble"].append(r"\usepackage{siunitx}")

X = [0, 1, 2, 3, 4, 5]
Y = [-2, 7 , 3 , 8 , 7, 5]
plt.plot(X, Y)
plt.xlabel('Distance (\si{\meter})')
plt.savefig('file.pgf')

但是它不起作用并产生错误消息:

  File "(...)\Anaconda3\lib\site-packages\matplotlib\backends\backend_pgf.py", line 375, in get_width_height_descent
    raise ValueError(msg % (text, e.latex_output))

ValueError: Error processing 'Distance (\si{\meter})'
LaTeX Output:
! Undefined control sequence.
<argument> ...12.000000}\selectfont Distance (\si 
                                              {\meter })
<*> ....000000}\selectfont Distance (\si{\meter})}

No pages of output.
Transcript written on texput.log.

如果我\si{\meter}用替换m,它确实有效。

因此我无法在 Python 中使用该siunitx包。我该如何让它工作?

答案1

这可能不是提出这个问题的正确地方,因为问题是关于 Matplotlib 和 Python 而不是关于 LaTeX,恕我直言。我使用siunitx以下方式:

pgf_with_latex = {                      # setup matplotlib to use latex for output
    "pgf.texsystem": "pdflatex",        # change this if using xetex or lautex
    "text.usetex": True,                # use LaTeX to write all text
    "font.family": "serif",
    "font.serif": [],                   # blank entries should cause plots 
    "font.sans-serif": [],              # to inherit fonts from the document
    "font.monospace": [],
    "axes.labelsize": 10,               # LaTeX default is 10pt font.
    "font.size": 10,
    "legend.fontsize": 8,               # Make the legend/label fonts 
    "xtick.labelsize": 8,               # a little smaller
    "ytick.labelsize": 8,
    "figure.figsize": figsize(0.9),     # default fig size of 0.9 textwidth
    "pgf.preamble": "\n".join([ # plots will use this preamble
        r"\usepackage[utf8]{inputenc}",
        r"\usepackage[T1]{fontenc}",
        r"\usepackage[detect-all,locale=DE]{siunitx}",
        ])
    }
mpl.rcParams.update(pgf_with_latex)

因此您必须更新pgf.preamble以包括r"\usepackage{siunitx}"

相关内容