Python 如何获取emf/wmf格式的matplotlib图形?
如何在MS Office(Word和PowerPoint)中以emf或wmf文件的形式获取matplotlib绘图,并将其用作矢量图形 我曾尝试使用Inkscape和LibreOffice Draw导出到svg并转换为emf,但这两个选项似乎都会导致图像质量下降,从而导致光栅图像Python 如何获取emf/wmf格式的matplotlib图形?,python,matplotlib,svg,wmf,Python,Matplotlib,Svg,Wmf,如何在MS Office(Word和PowerPoint)中以emf或wmf文件的形式获取matplotlib绘图,并将其用作矢量图形 我曾尝试使用Inkscape和LibreOffice Draw导出到svg并转换为emf,但这两个选项似乎都会导致图像质量下降,从而导致光栅图像 我也尝试过导出为pdf并转换为emf/wmf,但也有同样的问题。下面是我创建wmf和SVG的解决方案。您可以安装Inkscape并使用以下类“SaveAndClosePlot”创建SVG,然后使用Inkscape将其转
我也尝试过导出为pdf并转换为emf/wmf,但也有同样的问题。下面是我创建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
要使用Linux将图形另存为matplotlib中的
.emf
文件,请尝试以下操作:
.svg
,然后通过Inkscape子流程调用将其转换为.emf
。
例如:然后,您可以在MS Word或PowerPoint中将
.emf
图形作为图片插入。质量接近.svg
。但是请注意,大型.svg
文件可能无法工作。由于matplotlib不提供任何导出到这些格式的选项,因此需要使用一些外部转换。使用inkscape进行转换似乎是合理的。我没有遇到任何质量损失。我还提出了一个简单的解决方案来保存到EMF
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)