Преобразование текста в 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()
извне в модуле, чтобы всегда иметь ее под рукой.