Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在word/powerpoint中使用python创建矢量图形的最佳方法_Python_Svg_Matplotlib_Ms Word_Powerpoint - Fatal编程技术网

在word/powerpoint中使用python创建矢量图形的最佳方法

在word/powerpoint中使用python创建矢量图形的最佳方法,python,svg,matplotlib,ms-word,powerpoint,Python,Svg,Matplotlib,Ms Word,Powerpoint,我通常将python中的绘图保存为PNG。这很好,但在以后重新缩放时有明显的缺点。因此,我希望将绘图、图形等保存为矢量图形,然后将它们导入word或powerpoint等windows应用程序 我现在面临几个问题 将matplotlib中的某些内容保存为支持向量图形(SVG)效果良好。问题是,我无法(轻松)将其导入word或pp 储蓄为每股收益会产生可怕的结果。例如,我在两条线之间有阴影区域(使用0.3的alpha填充),在EPS中,这些区域完全着色。导入word/pp工作,但图形效果不佳 我

我通常将python中的绘图保存为PNG。这很好,但在以后重新缩放时有明显的缺点。因此,我希望将绘图、图形等保存为矢量图形,然后将它们导入word或powerpoint等windows应用程序

我现在面临几个问题

  • 将matplotlib中的某些内容保存为支持向量图形(SVG)效果良好。问题是,我无法(轻松)将其导入word或pp
  • 储蓄为每股收益会产生可怕的结果。例如,我在两条线之间有阴影区域(使用0.3的alpha填充),在EPS中,这些区域完全着色。导入word/pp工作,但图形效果不佳
  • 我还尝试使用inkscape将SVG文件转换为EPS。在这里,阴影区域仍然保留,但总体质量仍然不好(实际上看起来更像是一个糟糕的光栅图形),并且一些图例被切断
这里有一些图片试图将我的问题形象化


您正在Windows或Mac上使用什么版本的Office

更一般地说:在办公室使用EPS是一项特殊的业务。Office不以任何标准方式处理EPS。如果您总是使用PostScript打印机打印或使用其他基于PostScript的输出方法(例如,打印到PS,然后提取到PDF),那么如果您更改注册表以告知PPT(不知道Word)正常工作,EPS确实可以很好地工作。问问我,我看看能不能查到细节。否则,它会试图解释EPS本身的PS内容,可能会,也可能不会做好


你能转换成EMF(假设这里是Windows)吗?如果没有,你能控制图像的分辨率吗?通过转换为更高分辨率的PNG,您可能会获得最佳效果。

Windows现在似乎可以很好地支持将大多数PDF嵌入为矢量文件,并在导出为PDF时保留矢量特征。这是基于我使用Office 2011 for Mac的经验,但应该扩展到MS Office 2007 for Windows。我将matplotlib绘图保存为PDF格式,将其导入Word文档,并能够将其保存为矢量输出

一个缺点是:如果将PDF嵌入文本框中,Word会在将其保存为PDF时将其光栅化

要获得更高级的矢量支持,请尝试OpenOffice-我相信它支持直接SVG导入,但有一些bug。

对于仍然需要此功能的任何人,我编写了一个基本函数,可以让您将文件保存为matplotlib中的emf,只要您已经安装。 示例用法
谢谢你的回答。我使用Office 2007在Windows上工作。我不依赖于使用EPS,我更希望有一个可以在Word和/或Powerpoint中使用的矢量图形(最终Powerpoint并不重要,因为您通常不需要打印)。我没有试过,但我能做到。更高分辨率的PNG可能会有所帮助,但它们也会破坏文档。似乎有效的方法是生成PDF,但在Word中处理它们并不是那么容易,而且我不确定用Python生成的PDF是否是真正的矢量图形?对于您作为示例显示的图形,PNG的压缩应该可以很好地工作。无论如何,这值得一试。奇怪的是,与包含大量线段或曲线节点的矢量图形(如您所愿)相比,PowerPoint(可能还有Word)有时对大型PNG的响应更灵敏。您可以尝试将矢量图形转换为
wmf
emf
格式。后两种是Office本机支持的矢量图形格式。如果提供
savefig
命令,可能会有所帮助。
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')