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

Я хотел бы иметь возможность сохранять графики 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. Векторизуйте текст так, чтобы он внедрялся в виде контуров. Это поддерживается серверной частью SVG Matplotlib, устанавливая для rcParam 'svg.fonttype' значение 'path', но, похоже, это напрямую не поддерживается серверной частью ps. Это было бы идеальным решением. Есть какой-либо способ сделать это?
  2. Растрировать только текст при экспорте в формате .eps. Это было бы менее идеальным решением. Можно ли это сделать?

person Erlend Magnus Viggen    schedule 26.06.2014    source источник
comment
Я только что попытался встроить .eps файл в последнюю версию Microsoft Word (2016) на Mac, и теперь он, похоже, правильно отображает текст.   -  person mfitzp    schedule 07.01.2016
comment
Спасибо за тестирование, @mfitzp! С момента публикации этого вопроса моя компания обновила Word 2010 до Word 2013. Я решил попробовать еще раз, но проблема все еще существует. Либо проблема была исправлена ​​в Word 2016, либо версия Word для Mac стала лучше. Тем не менее, мои вопросы об обходных путях (вопросы, не относящиеся к платформе) все еще остаются в силе.   -  person Erlend Magnus Viggen    schedule 08.01.2016
comment
Я могу подтвердить, что он также не работает в Word 2013, по крайней мере, в Windows (к сожалению, не могу протестировать 2016).   -  person mfitzp    schedule 15.01.2016
comment
Как вы сохраняете изображение? вы используете savefig()?   -  person wesanyer    schedule 01.04.2016
comment
@wesanyer: Я сохранял картинку, используя графический интерфейс сюжета; Я считаю, что с пользовательским интерфейсом QT4Agg. Я полагаю, что графический интерфейс должен вызывать savefig (), чтобы фактически сохранить изображение.   -  person Erlend Magnus Viggen    schedule 02.04.2016
comment
Для Microsoft Word 2010 и 2013 я сохраняю цифру как .svg, а позже конвертирую ее в .emf с помощью бесплатного программного обеспечения под названием Inkscape.   -  person sebacastroh    schedule 05.05.2016
comment
Есть ли решение?   -  person cqcn1991    schedule 14.04.2017
comment
@ cqcn1991 Да, принятый ответ - это полнофункциональный обходной путь, хотя он также требует использования Inkscape для экспорта в тип файла, который Word может хорошо обрабатывать.   -  person Erlend Magnus Viggen    schedule 15.04.2017


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

person ImportanceOfBeingErnest    schedule 25.10.2016
comment
Хотя преобразование .svg в .emf с помощью Inkscape - своего рода хитрый обходной путь, ваш сценарий довольно удобен, и я могу подтвердить, что он работает отлично. Спасибо! - person Erlend Magnus Viggen; 27.10.2016
comment
В Inkscape 1.0 пришлось использовать --export-filename=foo.emf - person alexei; 08.05.2020