Как получить цифры matplotlib в формате emf/wmf?

Как я могу получить графики matplotlib в виде файлов emf или wmf, которые можно использовать в качестве векторной графики в MS Office (Word и PowerPoint)?

Я пытался экспортировать в svg и преобразовывать в emf, используя как Inkscape, так и LibreOffice Draw, но оба эти варианта, похоже, вызывают потерю качества изображения, что приводит к растровым изображениям.

Я также пробовал экспортировать в pdf и преобразовывать в emf/wmf, но это та же проблема.


person iamchoosinganame    schedule 07.11.2018    source источник
comment
Поскольку matplotlib не предоставляет никаких возможностей для экспорта в эти форматы, вам нужно будет использовать некоторое внешнее преобразование. Использование inkscape для преобразования кажется разумным. С потерей качества не столкнулся.   -  person ImportanceOfBeingErnest    schedule 07.11.2018
comment
Я также сделал простое решение для сохранения в EMF здесь   -  person Gilly Gumption    schedule 03.12.2019


Ответы (2)


Вот мое решение для создания WMF и SVG. Вы можете установить Inkscape и использовать следующий класс: «SaveAndClosePlot» создает SVG, а затем с помощью Inkscape преобразует его в WMF. Функцию TestPlot можно настроить под свои нужды.

import os
from pathlib import Path
from ConfigParserM import logging
import subprocess
from matplotlib import pyplot as plt


class SVG_WMF_Plot:

    def __init__(self):
        self.__folderNameGraph = 'Graphs'
        self.__WMF_SVGSaving = True
        self.__inkScapePath = "C://Program Files//inkscape//inkscape.exe"
        self.__figureDPI = 500

    def getRootDirectory(self):
        try:
            return Path(os.path.dirname(os.path.realpath('__file__')))

        except Exception as e:
            logging.exception(e)
            raise

    def getAddressTo(self, Main=None, FolderName=None, FileName=None, Extension=None):
        try:
            if Main is None:
                Main = self.getRootDirectory()
            if FolderName:
                Path1 = Path(Main) / Path(FolderName)
            else:
                Path1 = Path(Main)

            if not os.path.exists(Path1):
                os.makedirs(Path1)
            if FileName:
                if Extension:
                    File_Address = Path1 / Path(FileName + "." + Extension)
                else:
                    File_Address = Path1 / Path(FileName)
            else:
                File_Address = Path1
            return File_Address

        except Exception as e:
            logging.exception(e)
            raise

    def TestPlot(self):
        try:

            fig, ax1 = plt.subplots()
            x = [1, 2]
            y = [1, 2]
            F1 = 'test'
            ax1.plot(x, y)
            self.SaveAndClosePlot(folderName=self.__folderNameGraph, fileName=F1)


        except Exception as e:
            logging.exception(e)
            raise

    def SaveAndClosePlot(self, folderName, fileName):
        try:
            Address = self.getAddressTo(FolderName=self.__folderNameGraph + f"\{folderName}", FileName=fileName, Extension="jpg")
            plt.savefig(Address, format='jpg', dpi=self.__figureDPI, bbox_inches='tight')

            if self.__WMF_SVGSaving:
                Address = self.getAddressTo(FolderName=self.__folderNameGraph + f"\{folderName}", FileName=fileName, Extension="svg")
                plt.savefig(Address, format='svg', dpi=self.__figureDPI, bbox_inches='tight')
                # add removing SVG if needed

                AddressWMF = self.getAddressTo(FolderName=self.__folderNameGraph + f"\{folderName}", FileName=fileName, Extension="wmf")
                subprocess.call([self.__inkScapePath, str(Address.resolve()), '--export-wmf', str(AddressWMF.resolve())])

            plt.clf()
            plt.close()
        except Exception as e:
            logging.exception(e)
            raise
person Keyhan    schedule 14.09.2019

Чтобы сохранить цифры в виде файла .emf в matplotlib с помощью Linux, попробуйте следующее:

  1. Установите Inkscape (у меня установлен Inkscape 0.92.4 в Ubuntu 16.04. Другие версии должны работать одинаково)
  2. В matplotlib сохраните рисунок как .svg, а затем преобразуйте его в .emf через вызов подпроцесса Inkscape. Например:
    import numpy as np
    import subprocess
    import matplotlib.pyplot as plt
    
    x = np.arange(2,50,step=2)
    y = x**2
    plt.plot(x,y)
    plt.savefig('y_is_x^2.svg', format='svg', bbox_inches='tight')
    subprocess.call('inkscape y_is_x^2.svg -M y_is_x^2.emf',shell=True)

Затем вы можете вставить фигуру .emf в виде изображения в MS Word или PowerPoint. Качество близкое к .svg. Имейте в виду, однако, что большие .svg файлы могут не работать.

person Sam Macharia    schedule 03.03.2021