我想为演示生成高质量的图表。我正在使用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
字体或fantasy
或monospace
。但所有无衬线字体似乎都默认为Helvetica。
“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是正确的答案,但是由于我仍然无法让它工作,下面是我的最终解决方案:
注意,必须使用
fontproperties
键显式设置字体。显然,没有为fname
属性设置rc
(至少我没有找到它)。在实例化
font
时给一个family
键并不是严格必要的,它将被PDF后端忽略。此代码仅适用于
cairo
后端。使用MacOSX
不起作用。相关问题 更多 >
编程相关推荐