问题描述
如何将 matplotlib 绘图作为 emf 或 wmf 文件获取,这些文件可用作 MS Office(Word 和 PowerPoint)中的矢量图形?
How can I get matplotlib plots as emf or wmf files that are usable as vector graphics in MS Office (Word and PowerPoint)?
我尝试使用 Inkscape 和 LibreOffice Draw 导出到 svg 并转换为 emf,但这两个选项似乎都会导致图像质量下降,从而导致光栅图像.
I've tried exporting to svg and converting to emf using both Inkscape and LibreOffice Draw, but both of those options seem to cause image quality loss resulting in raster images.
我也试过导出为 pdf 并转换为 emf/wmf,但也有同样的问题.
I've also tried exporting to pdf and converting to emf/wmf, but that has the same issue.
推荐答案
这是我创建 WMF 和 SVG 的解决方案.您可以安装 Inkscape 并使用以下类,SaveAndClosePlot"创建 SVG,然后使用 Inkscape 将其转换为 WMF.可根据需要自定义TestPlot函数.
Here is my solution to create WMF and SVG. You can install Inkscape and use the following class, 'SaveAndClosePlot' creates SVG and then by using the Inkscape it converted to WMF. TestPlot function can be customized for your need.
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
这篇关于如何以emf/wmf格式获取matplotlib数字?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!