在 python 中创建矢量图形以用于 word/powerpoint 的最佳方法
Posted
技术标签:
【中文标题】在 python 中创建矢量图形以用于 word/powerpoint 的最佳方法【英文标题】:Best way to create vector graphics in python to be used in word/powerpoint 【发布时间】:2014-11-12 15:42:13 【问题描述】:我通常将 python 中的图保存为 PNG。这很好用,但在事后重新缩放时有明显的缺点。因此,我想将我的绘图、图形等保存为矢量图形,然后能够将它们导入到 Windows 应用程序中,例如 word 或 powerpoint。
我现在面临几个问题。
将 matplotlib 中的某些内容保存为支持矢量图形 (SVG) 可以正常工作。问题,我无法(轻松)将其导入 word 或 pp。 保存为 EPS 会产生可怕的结果。例如,我在两条线之间有阴影区域(使用 alpha 为 0.3 的 fill_between),在 EPS 中这些区域是全彩色的。导入 word/pp 可以,但图形不好。 我还尝试使用inkscape 将SVG 文件转换为EPS。这里阴影区域仍然保留,但整体质量再次不佳(看起来实际上更像是一个糟糕的光栅图形),并且一些图例也被切断了。这里有一些图像试图形象化我的问题。
【问题讨论】:
您可以尝试将矢量图形转换为wmf
或emf
格式。后两者是Office原生支持的矢量图形格式。
如果您提供savefig
命令可能会有所帮助。
对于任何在 2020 年或以后阅读本文的人来说,EPS 已经完全无法启动。曾经有一种方法可以防止 Office 通过注册表设置将其转换为 EMF,但在一三年前,Windows 上的 Office 应用程序将不再导入 EPS。另一方面,最近版本的 PPT 会导入 SVG,所以这就是我现在尝试解决问题的方法。
【参考方案1】:
This is a duplicate answer to this question.
对于仍然需要此功能的任何人,我编写了一个基本函数,可以让您将文件保存为 matplotlib 中的 emf,只要您安装了 inkscape。
import matplotlib.pyplot as plt
import subprocess
import os
inkscapePath = r"path\to\inkscape.exe"
savePath= r"path\to\images\folder"
def exportEmf(savePath, plotName, fig=None, keepSVG=False):
"""Save a figure as an emf file
Parameters
----------
savePath : str, the path to the directory you want the image saved in
plotName : str, the name of the image
fig : matplotlib figure, (optional, default uses gca)
keepSVG : bool, whether to keep the interim svg file
"""
figFolder = savePath + r"\."
svgFile = figFolder.format(plotName,"svg")
emfFile = figFolder.format(plotName,"emf")
if fig:
use=fig
else:
use=plt
use.savefig(svgFile)
subprocess.run([inkscapePath, svgFile, '-M', emfFile])
if not keepSVG:
os.system('del ""'.format(svgFile))
示例用法
import numpy as np
tt = np.linspace(0, 2*3.14159)
plt.plot(tt, np.sin(tt))
exportEmf(r"C:\Users\userName", 'FileName')
【讨论】:
【参考方案2】:Windows 现在似乎为将大多数 PDF 嵌入为矢量文件提供了良好的支持,并且在您导出为 PDF 时将保留矢量特征。这是基于我使用 Office 2011 for Mac 的经验,但应该扩展到 MS Office 2007 for Windows。我将我的 matplotlib 图保存为 PDF,将其导入 Word 文档,并能够将其保存为矢量输出。
一个问题:如果您将 PDF 嵌入文本框,Word 会在您将其保存为 PDF 时将其栅格化。
要获得更高级的矢量支持,请尝试使用 OpenOffice——我相信它支持直接 SVG 导入,尽管存在一些错误。
【讨论】:
【参考方案3】:您在 Windows 或 Mac 上使用什么版本的 Office?
更一般地说:将 EPS 与 Office 结合使用是一项特殊的业务。 Office 不以任何标准方式处理 EPS。如果您总是打印到 PostScript 打印机或使用其他一些基于 PostScript 的输出方法(例如打印到 PS 然后提取到 PDF),如果您更改注册表以告诉 PPT,EPS 确实可以很好地工作(不知道关于 Word) 行为正确。问,我会看看我是否可以挖掘细节。否则,它会尝试解释 EPS 本身的 PS 内容,可能会也可能不会做好。
你能转换成 EMF(假设这里是 Windows)吗?如果没有,您可以控制图像的分辨率吗?转换为更高分辨率的 PNG 可能会获得最佳效果。
【讨论】:
感谢您的回答。我使用 Office 2007 在 Windows 上工作。我不依赖于使用 EPS,我更希望有一个可以在 Word 和/或 Powerpoint 中使用的矢量图形(Powerpoint 最终并不那么重要,因为你通常不会需要打印这个)。 EMF 我没试过,但是可以。更高分辨率的 PNG 可以提供帮助,但它们也会破坏文档。似乎可行的是生成 PDF,但在 Word 中处理它们并不是那么容易,我不确定在 Python 中生成的 PDF 是否是真正的矢量图形? 对于您作为示例显示的那种图形,PNG 的压缩应该工作得很好。无论如何,值得一试。奇怪的是,PowerPoint(可能还有 Word)有时对大型 PNG 的响应速度比对包含大量线段或曲线节点的矢量图(如您所愿)的响应速度更快。以上是关于在 python 中创建矢量图形以用于 word/powerpoint 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
Java 在PPT中创建SmartArt图形读取SmartArt图形中的文本