【问题标题】:Antialiased text rendering in matplotlib pgf backendmatplotlib pgf 后端中的抗锯齿文本渲染
【发布时间】:2017-01-29 13:17:44
【问题描述】:

我对 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?这甚至可能吗?如果没有,我如何让文本、图例等在 Computer Modern 中像刻度标签一样被矢量化?

编辑:Python 3.4.4,matplotlib 1.5.2

这里是平滑刻度标签与参差不齐的 xlabel

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

【问题讨论】:

  • 我刚刚复制并执行了提供的代码,所有内容(包括“此文本未抗锯齿!0123456789”字符串)都在我机器上生成的 PDF 中进行了矢量化...
  • Did you zoom in? 这是我机器上的样子(0.4 来自 x-tick 标签,抗锯齿。另一方面,xlabel 不是)。
  • 是的,我放大了。here is my generated test.pdf file,请随意看看。
  • 很好奇。知道它对我不起作用的原因是什么吗?有系统字体问题吗?顺便说一句,我在 Windows 7 上。
  • 我没有确切的想法,它可能来自您的乳胶安装,但我只是猜测。我使用 Python 2.7.12、matplotlib 1.5.2 和 texlive 发行版以及 pdfTeX 版本 3.14159265-2.6-1.40.17

标签: python matplotlib fonts pdf-generation pgf


【解决方案1】:

我想我经过多次尝试终于找到了答案。我在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]) 手动设置轴标签。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    相关资源
    最近更新 更多