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

时间:2014-09-18 10:33:07

标签: python svg matplotlib ms-word powerpoint

我通常将我的情节保存在python中作为PNG。这很好,但在后来重新缩放时有明显的缺点。因此,我想将我的情节,数字等保存为矢量图形,然后将它们导入Windows应用程序,如word或powerpoint。

我现在面临几个问题。

  • 从matplotlib保存一些东西,因为支持向量图(SVG)工作正常。问题,我不能(轻松地)将其导入word或pp。
  • 保存为EPS会产生可怕的结果。例如,我在两条线之间有阴影区域(使用填充之间的alpha为0.3),在EPS中,这些区域是完全着色的。导入word / pp有效,但图形不好。
  • 我还尝试使用inkscape将SVG文件转换为EPS。这里阴影区域仍然保留,但整体质量再次不好(看起来更像是一个糟糕的光栅图形),还有一些传说被切断了。

以下是一些试图想象我的问题的图片。

plot saved as PNG after importing into word - the way it should look

plot saved as EPS after importing into word - no shading, axe labels and no legend (not shown)

plot saved as SVG and then converted to EPS using inkscape after importing into word - shading correct, but all writing (labels, title etc.) in poor quality, looks actually more like a bad raster graphic

3 个答案:

答案 0 :(得分:0)

您在Windows或Mac上使用的是哪个版本的Office?

更一般地说:将EPS与Office结合使用是一项特殊的业务。办公室不以任何标准方式处理EPS。如果您将始终打印到PostScript打印机或使用其他一些基于PostScript的输出方法(例如打印到PS然后提取到PDF),如果您进行注册表更改以告知PPT,那么EPS可以很好地工作(不要...知道Word)行为正常。问我和我是否可以挖掘细节。否则,它会尝试解释EPS本身的PS内容,可能会也可能不会很好地完成它。

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

答案 1 :(得分:0)

Windows现在似乎为将大多数PDF作为矢量文件嵌入提供了很好的支持,并且在导出为PDF时会保留矢量特征。这是基于我使用Office 2011 for Mac的经验,但应扩展到MS Office 2007 for Windows。我将matplotlib图保存为PDF,将其导入Word文档,并将其保存为矢量输出。

一个问题:如果您在文本框中嵌入PDF,Word会在将其保存为PDF时对其进行栅格化。

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

答案 2 :(得分:0)

This is a duplicate answer to this question.

对于仍然需要此功能的任何人,我编写了一个基本功能,只要您安装了inkscape,就可以通过matplotlib将文件保存为emf。

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')