matplotlib pgf后端中的抗锯齿文本呈现

时间:2016-09-21 10:29:39

标签: python matplotlib fonts pdf-generation pgf

我对matplotlib pgf后端的文本呈现有疑问。我使用matplotlib导出我的图的.pdf文件。在带有rcParameters的部分中,我定义了我想使用sans-serif并且我想使用Helvetica作为字体。因此,我禁用了选项text.usetex。这是一个MWE:

import matplotlib as mpl
import os

mpl.use('pgf')

pgf_with_latex = {                     
    "pgf.texsystem": "pdflatex",       
    "text.usetex": False,                
    "font.family": "sans-serif",
    "font.sans-serif": "Helvetica",
    "pgf.preamble": [
        r"\usepackage[utf8x]{inputenc}",    
        r"\usepackage[T1]{fontenc}",       
        r"\usepackage{textcomp}",
        r"\usepackage{sfmath}",
    ]
    }
mpl.rcParams.update(pgf_with_latex)

import matplotlib.pyplot as plt


def newfig():
    plt.clf()
    fig = plt.figure()
    ax = fig.add_subplot(111)
    return fig, ax

fig, ax = newfig()
ax.set_xlabel("Some x-label text")
ax.text(0.3, 0.5, r"This text is not antialiased! 0123456789", transform=ax.transAxes, fontsize=8)
plt.savefig(os.getcwd() + "/test.pdf")

结果是,刻度标签和文本在Computer Modern( - > LaTeX)而不是Helvetica中呈现,它们不会呈现为矢量图形并且看起来像素化。现在,当我启用text.usetex时,刻度标签变为矢量图形(我可以在不看像素的情况下放大),但文字没有!

我需要做些什么才能让所有东西(刻度标签,轴标签,图例,文字等)都被矢量化Helvetica?这甚至可能吗?如果没有,我如何让计算机现代中的文本,图例等矢量化,如刻度线标签?

编辑:Python 3.4.4,matplotlib 1.5.2

这里是光滑的刻度标签与不规则的xlabel Zoom

另一个编辑:如果我将文件保存为.eps而不是.pdf并启用usextex我会得到奇妙的矢量化字体,但刻度标签采用serif字体:<

1 个答案:

答案 0 :(得分:0)

我想我经过多次尝试后终于找到了答案。我在this SO post找到了它。

我只是将其添加到序言中:

r'\usepackage{helvet}',    # set the normal font here
r'\usepackage{sansmath}',  # load up the sansmath so that math -> helvet
r'\sansmath'               # <- tricky! -- gotta actually tell tex to use!

并设置"text.usetex": False"。现在它最终在任何地方使用Helvetica并且它在任何地方都被矢量化了......好吧,除了具有对数缩放的轴。在那里,我必须使用ax.set_yticklabels([1, 2, 3, 4])手动设置轴标签。