【问题标题】:matplotlib - plot outputs text as paths and cannot be converted to LaTeX by Inkscapematplotlib - 绘图输出文本为路径,不能被 Inkscape 转换为 LaTeX
【发布时间】:2013-01-14 02:07:23
【问题描述】:

我有一个matplotlib 图,我想将其保存为矢量图形格式,然后在 LaTeX 文档中使用。

我通常从matplotlib 保存它,用 Inkscape 打开它并将其保存为 PDF+LaTeX(省略 PDF 中的文本并创建 LaTeX 文件)。 这也可以通过以下方式实现:

inkscape  -D -z --file=in.pdf --export-pdf=out.pdf --export-latex

但是,对于下面的情节,文本实际上是一系列路径。每个字母都是独立的,导致 Inkscape 无法保存不同的 tex 文件。

为什么在下面的代码中,文本没有呈现为文本,而是呈现为路径?请注意,使用usetex=True 并没有什么不同。

谢谢。

from scipy.stats import lognorm
from matplotlib import rc

#rc('text', usetex=True)
rc('font', family='Times New Roman')
rc('font', size='20.0')

mu    = 1.7
sigma = 1.1
n, bins, patches = plt.hist(data, bins=10000, facecolor='k', edgecolor='k', 
                            normed=True, alpha=0.3, histtype='stepfilled',
                            label='\\noindent Empirical data')
y = lognorm.pdf( bins, sigma, scale=np.exp(mu))
plt.xlim( (0,50) )
plt.plot(bins, y, '-', color='k', linewidth=2, label='\\noindent Lognormal curve')
plt.ylim( (0, .15) )
plt.xlabel('my x label')
plt.ylabel('my y label')

plt.grid()
plt.legend()
plt.savefig(os.path.expanduser('~/myfile.svg'))

【问题讨论】:

  • 我不知道为什么它在 SVG 输出中使用路径而不是带有字体参考的文本,但是你不能使用 PDF 输出而不是 SVG 吗?它是一种矢量格式,并且嵌入了字体。
  • PDF 输出同样的问题!
  • 我得到了预期的输出 - 带有引用字体和文本流的 PDF。例如,尝试使用 LibreOffice Draw 打开文件,您应该可以看到文本框。
  • 同样的问题,即使使用 LibreOffice Draw,每个字母都有自己的框。我可以澄清一下,问题不在于是否有正确的字体(我的输出实际上有正确的字体),而是将每个字母绘制为路径而不是文本,因此导致标签无法识别为文本。
  • 当然,对于 SVG,我也得到了路径而不是文本,但对于 PDF,我得到了正确的文本:i.imgur.com/6JAhJn4.png LO Draw 中的 PDF 编辑是有限的,可以看出。我在 Windows 上使用 Python 2.7 和 MPL 1.2.0。也许你应该尝试暂时重置matplotlibrc

标签: matplotlib latex vector-graphics inkscape


【解决方案1】:

我遇到了同样的问题并修复了它。

http://matplotlib.org/users/customizing.html 中的 matplotlib 文档指出,svg.fonttype 参数的默认值为'path',这意味着在导出为 svg 格式时,字符将转换为路径。

我需要做的就是在我的脚本中添加以下行:

matplotlib.rcParams['svg.fonttype'] = 'none'

这样所有字符都被正确嵌入,我现在可以在 Inkscape 中编辑文本并将我的图形导出为 pdf+Latex,即我的tex 文件中包含的一个 pdf 文件和一个 pdf_tex 文件。

【讨论】:

  • 你是我的英雄,每周只为我节省几个小时的工作时间。谢啦! :)
  • 奇怪的是,这适用于我的一些标签,但不适用于其他标签。例如,它不适用于我在子图轴上通过“annotate”或“set_yticks”添加的文本,但它适用于在同一子图轴上通过“set_ylabel”添加的文本。
  • 对于 PDF 导出,这成功了:plt.rcParams['pdf.use14corefonts'] = True
【解决方案2】:

另一个更永久的选择是放置

svg.fonttype : none

在你的 matplotlibrc (例如~/.config/matplotlib/matplotlibrc)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-13
    • 2012-03-30
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多