Python Matplotlib:在EPS中光栅化部分绘图时删除黑色背景?

时间:2014-08-26 17:15:08

标签: python pdf svg matplotlib eps

此问题与a comment on another question有关。

在matplotlib / python中,我试图栅格化图像中的特定元素并将其保存到eps。问题是,当保存到EPS(但不是SVG或PDF)时,栅格化元素后面会出现黑色背景。

保存为PDF并转换为EPS似乎不是一个合理的解决方案,因为有一些奇怪的pdf2ps和pdftops转换问题使得理解边界框非常......可怕(或者更糟糕,看似不一致)。我当前的工作涉及在Inkscape中保存svg和导出的复杂过程,但这也不是必需的。

以下是重现问题所需的示例代码。将需要Matplotlib和Numpy。如果文件保存到mpl-issue.py,则可以使用以下命令运行:

python mpl-issue.py

#!/usr/bin/env python
# mpl-issue.py

import numpy as np
import matplotlib as mpl

# change backend to agg
# must be done prior to importing pyplot
mpl.use('agg')

import matplotlib.pyplot as plt

def transparencytest():
    # create a figure and some axes
    f = plt.figure()
    a = {
        'top': f.add_subplot(211),
        'bottom': f.add_subplot(212),
    }

    # create some test data
    # obviously different data on the subfigures
    # just for demonstration
    x = np.arange(100)
    y = np.random.rand(len(x))
    y_lower = y - 0.1
    y_upper = y + 0.1

    # a rasterized version with alpha
    a['top'].fill_between(x, y_lower, y_upper, facecolor='yellow', alpha=0.5, rasterized=True)

    # a rasterized whole axis, just for comparison
    a['bottom'].set_rasterized(True)
    a['bottom'].plot(x, y)

    # save the figure, with the rasterized part at 300 dpi
    f.savefig('testing.eps', dpi=300)
    f.savefig('testing.png', dpi=300)
    plt.close(f)

if __name__ == '__main__':
    print plt.get_backend()
    transparencytest()

testing.png图片如下所示: testing.png

testing.eps图像最终看起来像这样(在转换后的pdf版本和图形栅格化的png中): testing.eps

光栅化元素背后的黑色背景不应该存在。如何在保存带有栅格化元素的eps图形时删除黑色背景?

这已经过一系列其他mpl后端的测试,因此它似乎不是agg的特定问题。 Mac OS X 10.9.4,Python 2.7.8由MacPorts构建,Matplotlib 1.3.1。

1 个答案:

答案 0 :(得分:0)

这是一个已修复的已知错误。

这是因为eps不知道透明度,而栅格化的默认背景颜色是(0,0,0,0)(黑色是完全透明的)。

我也遇到了这个问题(https://github.com/matplotlib/matplotlib/issues/2473),它在昨晚发布的matplotlib 1.4.0中得到修复(https://github.com/matplotlib/matplotlib/pull/2479)。