Converting text in Matplotlib when exporting .eps files

早过忘川 提交于 2019-12-23 07:12:05

问题


I'd like to be able to save Matplotlib plots and add them directly as vector graphics in Microsoft Word documents. However, the only format supported by Word and Matplotlib both is .eps, and the axis text is completely missing in Word if I try. I'll show you:

Here's a minimal working example script:

import matplotlib.pyplot as plt
import numpy as np

axes = plt.gca()
data = np.random.random((2, 100))
axes.plot(data[0, :], data[1, :])
  • Here's the image I get if I save the plot as .png using the figure's toolbar
  • Here's the image I get if I save the plot as .eps and insert it into Word.

Apparently, the way that Matplotlib saves text in .eps files is incompatible with the way that Word reads text from .eps files. The exported .eps files look fine in PS_View.

I can think of two workarounds, but I don't know how to implement them or if it is at all possible in Matplotlib:

  1. Vectorise the text so that it is embedded as paths. This is supported by Matplotlib's SVG backend by setting the rcParam 'svg.fonttype' to 'path', but it doesn't seem directly supported by the ps backend. This would be the ideal workaround. Is there any way to do this?
  2. Rasterise only the text when exporting as .eps. This would be a less ideal workaround. Can this be done?

回答1:


As sebacastroh points out, one can save the matplotlib figure as svg using plt.savefig() and then use Inkscape to do the conversion between svg and emf. Enhanced Meta files (emf) are easily read by any Office programm.
This can be automated, like so

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)

It may also make sense to save the saveEMF() function externally in a module to always have it at hand.



来源:https://stackoverflow.com/questions/24425337/converting-text-in-matplotlib-when-exporting-eps-files

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!