Matplotlib PDF导出使用错误的字体

Kon*_*lph 14 python macos matplotlib cairo

我想为演示文稿生成高质量的图表.我正在使用Python的matplotlib来生成图形.不幸的是,PDF导出似乎忽略了我的字体设置.

我尝试通过将FontProperties对象传递给文本绘图函数并通过全局设置选项来设置字体.为了记录,这里有一个重现问题的MWE:

import scipy
import matplotlib
matplotlib.use('cairo')
import matplotlib.pylab as pylab
import matplotlib.font_manager as fm

data = scipy.arange(5)

for font in ['Helvetica', 'Gill Sans']:
    fig = pylab.figure()
    ax = fig.add_subplot(111)
    ax.bar(data, data)
    ax.set_xticks(data)
    ax.set_xticklabels(data, fontproperties = fm.FontProperties(family = font))
    pylab.savefig('foo-%s.pdf' % font)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,生成的输出都是相同的并使用Helvetica(是的,我确实安装了两种字体).

只是为了确定,以下内容也无济于事:

matplotlib.rc('font', family = 'Gill Sans')
Run Code Online (Sandbox Code Playgroud)

最后,如果我替换后端,而是使用本机查看器:

matplotlib.use('MacOSX')
Run Code Online (Sandbox Code Playgroud)

确实显示了正确的字体 - 但仅限于查看器GUI.PDF输出再次出错.

可以肯定 - 我可以设置其他字体 - 但只能设置其他类型的字体系列:我可以设置serif字体或fantasymonospace.但是所有sans-serif字体似乎都默认为Helvetica.

Kon*_*lph 8

基本上,@ Jouni是正确的答案,但由于我仍然遇到一些麻烦,这是我的最终解决方案:

#!/usr/bin/env python2.6

import scipy
import matplotlib
matplotlib.use('cairo')
import matplotlib.pylab as pylab
import matplotlib.font_manager as fm

font = fm.FontProperties(
        family = 'Gill Sans', fname = '/Library/Fonts/GillSans.ttc')

data = scipy.arange(5)
fig = pylab.figure()
ax = fig.add_subplot(111)
ax.bar(data, data)
ax.set_yticklabels(ax.get_yticks(), fontproperties = font)
ax.set_xticklabels(ax.get_xticks(), fontproperties = font)
pylab.savefig('foo.pdf')
Run Code Online (Sandbox Code Playgroud)

请注意,必须使用fontproperties密钥明确设置字体.显然,rcfname房产没有设置(至少我没有找到它).

familyfont这里不一定非常需要在实例化中给出密钥,PDF后端将忽略它.

此代码cairo仅适用于后端.使用MacOSX不起作用.


Jou*_*nen 3

“family”参数和相应的 rc 参数并不意味着指定字体的名称,实际上可以这样使用。有一个(可以说是巴洛克式的)类似 CSS 的字体选择系统,可以帮助相同的脚本在不同的计算机上工作,选择最接近的可用字体。通常推荐使用eg Gill Sans 的方法是将其添加到rc 参数font.sans-serif 值的前面(参见示例rc 文件),然后将font.family 设置为sans-serif。

如果字体管理器出于某种不明原因决定 Gill Sans 与您的规范不最接近,这可能会很烦人。绕过字体选择逻辑的一种方法是使用FontProperties(fname='/path/to/font.ttf')( docstring )。

就你而言,我怀疑 MacOSX 后端通过操作系统的机制使用字体,因此自动支持各种字体,但 pdf 后端有自己的字体支持代码,不支持你的 Gill Sans 版本。