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

12 投票
1 回答
3025 浏览
提问于 2025-04-18 11:08

我想把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, :])

显然,Matplotlib在保存.eps文件时,文字的保存方式和Word读取.eps文件的方式不兼容。导出的.eps文件在PS_View中看起来没问题。

我能想到两个解决办法,但我不知道怎么实现,或者在Matplotlib中是否可能:

  1. 把文字转成矢量形式,这样它就会作为路径嵌入。这在Matplotlib的SVG后端中可以通过设置rcParam 'svg.fonttype'为'path'来实现,但在ps后端似乎不直接支持。这是最理想的解决办法。有办法做到这一点吗?
  2. 在导出为.eps时,只把文字栅格化。这是一个不太理想的解决办法。可以做到吗?

1 个回答

3

正如sebacastroh提到的,我们可以使用plt.savefig()将matplotlib图形保存为svg格式,然后再用Inkscape这个软件把svg转换成emf格式。增强型元文件(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()这个功能单独保存到一个模块里也是个好主意,这样随时都能用到。

撰写回答