2014-06-26 39 views
11

我希望能够保存Matplotlib图并将它们直接作为矢量图形添加到Microsoft Word文档中。但是,Word和Matplotlib支持的唯一格式都是.eps,如果尝试,Word中的轴文本完全缺失。我会告诉你:在导出.eps文件时转换Matplotlib中的文本

这里有一个最小的工作示例脚本:

import matplotlib.pyplot as plt 
import numpy as np 

axes = plt.gca() 
data = np.random.random((2, 100)) 
axes.plot(data[0, :], data[1, :]) 

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

我能想到的两种解决方法,但我不知道如何来实现,或者如果它在Matplotlib是在所有可能的:

  1. Vectorise的文本,以便它被嵌入的路径。 Matplotlib的SVG后端通过将rcParam'svg.fonttype'设置为'path'来支持这一点,但似乎ps后端并没有直接支持它。这将是理想的解决方法。有没有办法做到这一点?
  2. Rasterise only导出为.eps时的文本。这将是一个不太理想的解决方法。这可以做到吗?
+1

我刚刚尝试在Mac上嵌入最新的Microsoft Word(2016)中的'.eps'文件,现在它似乎正确显示文本。 – mfitzp

+0

感谢您的测试,@ mfitzp!自从发布这个问题我的公司已经从Word 2010升级到Word 2013.我决定再试一次,但问题仍然存在。无论是在Word 2016中修复问题,还是Mac版本的Word都更好。尽管如此,我关于解决方法(非特定于平台的问题)的问题依然存在。 –

+2

我可以证实它至少在Windows上也不适用于Word 2013(不幸的是,2016年不能测试)。 – mfitzp

回答

2

作为sebacastroh所指出的,人们可以使用plt.savefig()保存matplotlib数字作为svg,然后使用Inkscape中做svgemf之间的转换。任何Office程序都可以轻松读取增强型元文件(emf)。
这可以自动化,像这样

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()功能的模块中总是有它在手。

+0

尽管使用Inkscape从'.svg'转换为'.emf'有点麻烦,但您的脚本非常方便,我可以确认它的工作原理。谢谢! –