Matplotlib PDF导出使用错误的字体

2024-04-19 01:44:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想为演示生成高质量的图表。我正在使用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)

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

当然,以下几点也没有帮助:

matplotlib.rc('font', family = 'Gill Sans')

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

matplotlib.use('MacOSX')

显示正确的字体,但只能在查看器GUI中显示。PDF输出再次出错。

当然,我可以设置其他字体,但只能设置其他类型的字体:我可以设置serif字体或fantasymonospace。但所有无衬线字体似乎都默认为Helvetica。


Tags: importdatapdfmatplotlibuseas字体scipy
2条回答

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

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

在您的情况下,我怀疑MacOSX后端通过操作系统的机制使用字体,因此自动支持各种字体,但pdf后端有自己的字体支持代码,不支持您的Gill SAN版本。

基本上,@Jouni's是正确的答案,但是由于我仍然无法让它工作,下面是我的最终解决方案:

#!/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')

注意,必须使用fontproperties键显式设置字体。显然,没有为fname属性设置rc(至少我没有找到它)。

在实例化font时给一个family键并不是严格必要的,它将被PDF后端忽略。

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

相关问题 更多 >