3

如果我使用 matplotlib 保存图形,有时某些字符(例如 endash、ű énd ő)的位置比其他字符低。不仅在图例中,而且在标签和标题中也是如此。我在 Ubuntu 11.10 和 12.04 上使用 matplotlib 1.0.1 和 1.1.1~rc1 进行了尝试。文件源为utf-8编码,Python版本为2.7.2+。这是来源:

import matplotlib.pyplot as plt
from numpy import sin, linspace, pi
x = linspace(0, 20, 1000)
plt.plot(x, sin(x), label=u"Hurrá, őrtűz! Szűztűz.")
plt.plot(x, sin(x), label=u"xxxxá, őx–x–xűx! Sxűxxűx.")
plt.plot(x, sin(x+pi/2), label=u"B–A őrűr ()")
plt.plot(x, sin(x-pi/2), label=u"B–A őrűr")
plt.plot(x, sin(x+pi), label=u"xãxâxőxŐxűxŰx–x endash")
plt.plot(x, sin(x+.1), label=u"őrtűz !")
plt.plot(x, sin(x+.2), label=u"őr tűz! (")
plt.plot(x, sin(x+pi+.2), label=u"őrült tűzlány ãxâ")
plt.title(u"matplotlib version 1.0.1, source: utf-8, Ubuntu 11.10")
plt.legend()
plt.savefig("tmp_accent.pdf")
plt.savefig("tmp_accent.eps")

这是我得到的数字的一部分。(我用 evince 和 acroread 看过)。

我得到的PDF文件的一部分(用evince,但用acroread是一样的)

我不擅长字体,但我在 matplotlibrc 中设置了 font.sans-serif 字体,Bitstream Vera Sans、Lucida Grande、Verdana、Geneva、Lucid、Arial、Helvetica、Avant Garde 字体一一设置。

我可以使用 epspdf 命令行工具从 eps 版本制作一个更好的版本,但这种方法取决于平台。有没有更好的办法?问题存在于较新的 matplotlib 版本或较新的 Ubuntu 中?

4

1 回答 1

1

似乎呈现 unicode 存在各种问题,尤其是 pdf 文件。我看到了与您使用稍有不同的 matplotlib 版本(见下文)相同的问题。如果我切换到不同的 matplotlib 后端,或者如果您安装了乳胶,则不会发生这种情况,您可以让乳胶进行文本渲染(请参阅http://matplotlib.org/users/usetex.html)。在 Ubuntu 上,texlive-latex-extra如果您还没有安装该软件包,我相信您需要安装它。

乳胶

Latex 方法效果最好,但速度要慢得多,并且当然会引入很大的外部依赖性。我在文件顶部添加了以下三行:

import matplotlib
matplotlib.rcParams['text.usetex']=True
matplotlib.rcParams['text.latex.unicode']=True

请看下面的结果——看起来不错,但您可能想要对轴刻度标签做一些事情。

开罗

或者,您可以使用 GTKCairo 后端。我在代码顶部添加了两行:

import matplotlib
matplotlib.use("GTKCairo")

您可以在下图中看到它并不完美——图例文本已正确对齐,但不幸的是它现在偏离了图例框。我真的不知道为什么会发生这种情况,但一种可能的解决方法是将行更改plt.legend()plt.legend(borderpad=2),它给出了下面的最终图像。现在有太多的空白,但至少文本适合。您也许可以尝试不同的图例选项来获得看起来更好的东西。

图片

请注意,它们在这里看起来比原始 pdf 文件中的要糟糕得多。我刚刚将 pdf 文件直接上传到 imgur,这似乎将它们转换为分辨率相当低的图像。

起初:

TKAGG 后端

用乳胶: 乳胶文字渲染

乳胶pdf的特写截图:

在此处输入图像描述

使用 GTKCairo 后端:

GTK开罗

使用 GTKCairo 和borderpad=2

GTKCairo 带边框

于 2013-05-22T12:33:02.150 回答