Преобразование текста в Matplotlib при экспорте файлов .eps

Я хотел бы иметь возможность сохранять графики Matplotlib и добавлять их непосредственно в виде векторной графики в документах Microsoft Word. Тем не менее, единственный формат, поддерживаемый Word и Matplotlib, - это .eps, и текст текста полностью отсутствует в Word, если я пытаюсь. Я покажу вам:

Здесь минимальный рабочий пример 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, :])

По-видимому, способ, которым Matplotlib сохраняет текст в файлах .eps, несовместим с тем, как Word читает текст из файлов .eps. Экспортированные файлы .eps отлично смотрятся в PS_View.

Я могу вспомнить два обходных решения, но я не знаю, как их реализовать или если это возможно в Matplotlib:

  • Нарисуйте текст так, чтобы он был встроен в качестве путей. Это поддерживается материнским сервером Matplotlib SVG, устанавливая параметр rcParam 'svg.fonttype' в 'path', но он, похоже, напрямую не поддерживается бэкэндом ps. Это было бы идеальным решением. Есть ли способ сделать это?
  • Растрировать только текст при экспорте в формате .eps. Это было бы менее оптимальным решением. Это можно сделать?

Ответ 1

Как указывает sebacastroh, можно сохранить значение matplotlib как svg с помощью plt.savefig(), а затем использовать 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() извне в модуле, чтобы всегда иметь ее под рукой.