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字体或fantasy或monospace.但是所有sans-serif字体似乎都默认为Helvetica.
基本上,@ 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密钥明确设置字体.显然,rc该fname房产没有设置(至少我没有找到它).
family在font这里不一定非常需要在实例化中给出密钥,PDF后端将忽略它.
此代码cairo仅适用于后端.使用MacOSX不起作用.
“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 版本。