在matplotlib保存的pdf绘图中,有些字符位于较低位置

2024-09-27 21:26:15 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我用matplotlib保存一个图形,有时某些字符,如endash,űndő,会比其他字符处于更低的位置。不仅仅是在传说中,还有在标签和标题上。我用matplotlib 1.0.1和1.1.1~rc1在ubuntu11.10和12.04上试用过。文件的源代码用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")

这是我得到的部分数据。(我用埃文斯和acroread查看)。在

The part of the PDF file I got (with evince, but with acroread is the same)

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

我可以用epspdf命令行工具从eps版本生成一个更好的版本,但是这个方法依赖于平台。有更好的方法吗?问题是在更新的matplotlib版本还是在更新的Ubuntu中?在


Tags: import版本plotmatplotlibubuntupipltsin
1条回答
网友
1楼 · 发布于 2024-09-27 21:26:15

似乎在呈现unicode时存在各种各样的问题,尤其是对于pdf文件。 我看到了与使用略有不同的matplotlib版本(见下文)时相同的问题。 如果我切换到另一个matplotlib后端,或者,如果您安装了latex,您可以让latex进行文本呈现(请参见http://matplotlib.org/users/usetex.html)。在Ubuntu上,我相信你需要安装texlive-latex-extra包,如果你还没有的话。在

乳胶漆

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

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

看下面的结果看起来不错,但你可能想做一些关于轴刻度标签的事情。在

开罗

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

^{pr2}$

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

图像

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

最初:

TKAGG backend

含乳胶: Latex text rendering

latex pdf的特写截图:

enter image description here

使用GTKCairo后端:

GTKCairo

使用GTKCairo和borderpad=2

GTKCairo with borderpad

相关问题 更多 >

    热门问题