在导出.eps文件时,将Matplotlib中的文本转换

12

我希望能够将Matplotlib绘制的图形保存为矢量图,并直接添加到Microsoft Word文档中。然而,Word和Matplotlib都仅支持.eps格式,如果我尝试这样做,Word中的坐标轴文本将完全丢失。我来给你展示一下:

这是一个最小工作示例脚本:

import matplotlib.pyplot as plt
import numpy as np

axes = plt.gca()
data = np.random.random((2, 100))
axes.plot(data[0, :], data[1, :])
  • 如果我使用图形工具栏将绘图保存为.png格式,我得到的是这张图片
  • 如果我将绘图保存为.eps格式并将其插入Word中,我得到的是这张图片

显然,Matplotlib将文本保存在.eps文件中的方式与Word从.eps文件读取文本的方式不兼容。导出的.eps文件在PS_View中看起来很好。

我能想到两种解决方法,但我不知道如何实现它们,也不知道在Matplotlib中是否可以实现:

  1. 将文本向量化,使其嵌入为路径。Matplotlib的SVG后端支持此操作,只需将rcParam“svg.fonttype”设置为“path”,但似乎并不直接支持ps后端。这将是理想的解决方法。有没有办法做到这一点?
  2. 仅在导出为.eps时栅格化文本。这将是一个较不理想的解决方法。这可以做到吗?

1
我刚刚尝试在Mac上的最新Microsoft Word(2016)中嵌入了一个.eps文件,现在它似乎可以正确地显示文本。 - mfitzp
2
我可以确认它在至少 Windows 上的 Word 2013 上也无法工作(不幸的是无法测试 2016)。 - mfitzp
你是如何保存图片的?你使用了 savefig() 吗? - wesanyer
3
对于Microsoft Word 2010和2013,我将图形保存为.svg格式,然后使用一个叫做Inkscape的免费软件将其转换为.emf格式。 - sebacastroh
现在它有解决方案了吗? - ZK Zhao
显示剩余3条评论
1个回答

3

正如sebacastroh指出的那样,可以使用plt.savefig()将matplotlib图形保存为svg,然后使用Inkscape在svgemf之间进行转换。增强型图像文件(emf)可被任何Office程序轻松读取。
这可以自动完成,如下所示:

import matplotlib.pyplot as plt
import numpy as np
from subprocess import call

def saveEMF(filename):
    path_to_inkscape = "D:\Path\to\Inkscape\inkscape.exe"
    call([path_to_inkscape, "--file", filename,  "--export-emf",  filename[:-4]+".emf" ])

axes = plt.gca()
data = np.random.random((2, 100))
axes.plot(data[0, :], data[1, :])
plt.title("some title")
plt.xlabel(u"some x label [µm]")
plt.ylabel("some y label")

fn = "data.svg"
plt.savefig(fn)
saveEMF(fn)

saveEMF()函数保存在外部模块中始终可用也是有意义的。


虽然使用Inkscape从.svg转换为.emf有点hacky,但您的脚本非常方便,我可以确认它完美地工作。谢谢! - Erlend Magnus Viggen
1
在Inkscape 1.0中,必须使用--export-filename=foo.emf - alexei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接