Matplotlib 和 Xelatex
Matplotllib and Xelatex
一段时间以来,我一直试图找到我的问题的答案,但找不到适合我的答案。我的问题是:如何使用 Xelatex 在 Matplotlib 中编译文本?
我知道有这个页面:
http://matplotlib.org/users/pgf.html
但是,我无法想出可行的方法。我到现在为止:
import matplotlib as mpl
mpl.use("pgf")
## TeX preamble
preamble = """
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
"""
params = {"text.usetex": True,
'pgf.texsystem': 'xelatex',
'pgf.preamble': preamble}
mpl.rcParams.update(params)
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.xlabel(r'\textsc{Something in small caps}', fontsize=20)
plt.ylabel(r'Normal text ...', fontsize=20)
plt.savefig('test.pdf')
运行 此代码产生以下警告:
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backends/backend_pgf.py:51: UserWarning: 从 fc-list 获取字体时出错
warnings.warn('error getting fonts from fc-list', 用户警告)
创建了一个输出文件,但我没有发现字体有误(不是 Linux Libertine),尽管我已经安装了字体并且能够将其与 XeLaTex 一起使用(我能够编写使用 Linux Libertine 字体设置的 xelatex 的 pdf 文件)。
任何帮助将不胜感激....
您的代码存在一些问题:
- 您需要使用以下选项让 Latex 控制字体:
'pgf.rcfonts': False
- 您还应该为 xelatex 使用 unicode:
'text.latex.unicode': True
。
- 'pgf.preamble' 需要 python 单个乳胶命令列表。
- 如果您将字体设置为 'Linux Libertine O',您可能需要衬线字体,
所以
'font.family': 'serif'
- 注意序言中的转义序列,您应该将其设为原始字符串
- 在文件开头添加一个unicode标签,确保编码为utf-8
使用这个,你的代码变成:
# -*- coding:utf-8 -*-
import matplotlib as mpl
mpl.use("pgf")
## TeX preamble
preamble = [
r'\usepackage{fontspec}',
r'\setmainfont{Linux Libertine O}',
]
params = {
'font.family': 'serif',
'text.usetex': True,
'text.latex.unicode': True,
'pgf.rcfonts': False,
'pgf.texsystem': 'xelatex',
'pgf.preamble': preamble,
}
mpl.rcParams.update(params)
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.xlabel(r'\textsc{Something in small caps}', fontsize=20)
plt.ylabel(r'Normal text ...', fontsize=20)
plt.savefig('test.pdf')
结果:
一段时间以来,我一直试图找到我的问题的答案,但找不到适合我的答案。我的问题是:如何使用 Xelatex 在 Matplotlib 中编译文本?
我知道有这个页面: http://matplotlib.org/users/pgf.html
但是,我无法想出可行的方法。我到现在为止:
import matplotlib as mpl
mpl.use("pgf")
## TeX preamble
preamble = """
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
"""
params = {"text.usetex": True,
'pgf.texsystem': 'xelatex',
'pgf.preamble': preamble}
mpl.rcParams.update(params)
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.xlabel(r'\textsc{Something in small caps}', fontsize=20)
plt.ylabel(r'Normal text ...', fontsize=20)
plt.savefig('test.pdf')
运行 此代码产生以下警告: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backends/backend_pgf.py:51: UserWarning: 从 fc-list 获取字体时出错 warnings.warn('error getting fonts from fc-list', 用户警告)
创建了一个输出文件,但我没有发现字体有误(不是 Linux Libertine),尽管我已经安装了字体并且能够将其与 XeLaTex 一起使用(我能够编写使用 Linux Libertine 字体设置的 xelatex 的 pdf 文件)。
任何帮助将不胜感激....
您的代码存在一些问题:
- 您需要使用以下选项让 Latex 控制字体:
'pgf.rcfonts': False
- 您还应该为 xelatex 使用 unicode:
'text.latex.unicode': True
。 - 'pgf.preamble' 需要 python 单个乳胶命令列表。
- 如果您将字体设置为 'Linux Libertine O',您可能需要衬线字体,
所以
'font.family': 'serif'
- 注意序言中的转义序列,您应该将其设为原始字符串
- 在文件开头添加一个unicode标签,确保编码为utf-8
使用这个,你的代码变成:
# -*- coding:utf-8 -*-
import matplotlib as mpl
mpl.use("pgf")
## TeX preamble
preamble = [
r'\usepackage{fontspec}',
r'\setmainfont{Linux Libertine O}',
]
params = {
'font.family': 'serif',
'text.usetex': True,
'text.latex.unicode': True,
'pgf.rcfonts': False,
'pgf.texsystem': 'xelatex',
'pgf.preamble': preamble,
}
mpl.rcParams.update(params)
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.xlabel(r'\textsc{Something in small caps}', fontsize=20)
plt.ylabel(r'Normal text ...', fontsize=20)
plt.savefig('test.pdf')