我想在 matplotlib 图的轴描述中使用欧元符号,这些图使用 pgf 后端保存为 pgf 文件。当我使用以下代码时:
import numpy as np
import matplotlib.pyplot as mplot
import matplotlib.cm as cm
import matplotlib
import scipy.optimize
def f(x,sign=1.0):
out = sign*(5*x + 6e-1*np.pi*(1/x))
return out
mplot.close('all')
x = np.linspace(0.1,1)
y = f(x)
mplot.plot(x,y)
mplot.grid(1)
mplot.axis([0,1,0,20])
mplot.xlabel(r'$\log(\frac{d_a}{d_i})$')
mplot.ylabel(r'$\frac{\euro}{a}$')
mplot.savefig('minimum.pgf')
结果出现以下错误:
ValueError: Error processing '\(\displaystyle \frac{\euro}{a}\)'
LaTeX Output:
! Undefined control sequence.
<argument> \euro
<*> ...lectfont \(\displaystyle \frac{\euro}{a}\)}
No pages of output.
Transcript written on texput.log.
通常建议的解决方案是让 matplotlib 始终使用 LaTeX:
# coding: utf-8
# In[2]:
import numpy as np
import matplotlib.pyplot as mplot
import matplotlib.cm as cm
import matplotlib
from mpl_toolkits.mplot3d import Axes3D as m3d
import scipy.optimize
# In[3]:
#matplotlib.use("pgf")
pgf_with_xelatex = {
'text.usetex': True,
'text.latex.unicode': True,
'pgf.rcfonts': False,
'font.family': 'sans-serif',
"pgf.texsystem": "xelatex",
"pgf.preamble": [
r"\usepackage{amssymb}",
r"\usepackage{amsmath}",
r"\usepackage{fontspec}",
r"\setmainfont{Gentium Book Basic}",
r"\setsansfont{Open Sans Light}",
r"\usepackage{unicode-math}",
r"\setmathfont{TeX Gyre Termes Math}"
]
}
matplotlib.rcParams.update(pgf_with_xelatex)
# In[4]:
def f(x,sign=1.0):
out = sign*(5*x + 6e-1*np.pi*(1/x))
return out
# In[5]:
mplot.close('all')
x = np.linspace(0.1,1)
y = f(x)
mplot.plot(x,y)
mplot.grid(1)
mplot.axis([0,1,0,20])
mplot.xlabel(r'$\log(\frac{d_a}{d_i})$')
mplot.ylabel(r'$\frac{\euro}{a}$')
mplot.savefig('minimum.pgf')
python代码执行没有错误,但是有两个问题。
- matplotlib 图中缺少欧元符号(参见纵坐标轴),并且所有内容都是衬线的,而我期望它是无衬线的:
- 生成的 pgf 图像有欧元符号,但所有内容都是衬线的,而且似乎不符合我的字体选择:
使用 matplotlib 生成的类似 pgf 图像,但未在 matplotlib 配置中指定 LaTeX,则会生成以下图:
轴刻度字体是 Open Sans Light。我想使用衬线数学字体来描述轴,其他内容保持不变。
无衬线刻度文本在 pgf 中用以下行指定:
\begin{pgfscope}%
\pgftext[x=2.550000in,y=0.544444in,,top]{{\sffamily\fontsize{12.000000}{14.400000}\selectfont 5}}%
\end{pgfscope}%
在带有衬线刻度的 pgf 中,刻度文本指定如下:
\begin{pgfscope}%
\pgftext[x=1.000000in,y=0.544444in,,top]{{\sffamily\fontsize{12.000000}{14.400000}\selectfont \(\displaystyle 0.0\)}}%
\end{pgfscope}%
这是我为 pgf 图形制作的 LaTeX MWE:
\documentclass{scrartcl}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{pgf}
\usepackage{graphicx}
\usepackage{unicode-math}
\usepackage{array}
\usepackage{fonts}
\DeclareMathOperator*{\argmax}{arg max}
\begin{tabular}{m{5cm}m{0.8\textwidth}}
\raggedleft \begin{equation*} \argmax_{x} f_{\mathrm{H}1}(x) = \begin{pmatrix} 8.6997998 \\ 6.7664998 \end{pmatrix}
\end{equation*} & \resizebox{0.8\textwidth}{!}{\input{minimum.pgf}}
\end{tabular}
\end{document}
fonts.sty 包含:
\setmathfont{TeX Gyre Termes Math}
\setmainfont{Gentium Book Basic}
\setsansfont{Open Sans Light}