为什么matplotlib fill_between仅在PDF上绘制边缘线?

Hoo*_*ked 11 python pdf png matplotlib

在python中matplotlib.fill_between,下面的下面的最小工作示例正确地绘制到屏幕上,并且到了.png..pdf然而,在结果中,仍然绘制边缘线.我怎样才能解决这个问题?

from numpy import *
import pylab as plt

# Sample data
X  = linspace(0,2*pi,1000)
Y0 = sin(X)
Y1 = sin(X+.2)
Y2 = sin(X+.4)

# fill_kwargs (what am I missing?)
fbk = {'lw':0.0, 'edgecolor':None}

ax = plt.subplot(111)
ax.fill_between(X, 0, Y0 , facecolor = 'b', **fbk)
ax.fill_between(X, Y0, Y1, facecolor = 'g', **fbk)
ax.fill_between(X, Y1, Y2, facecolor = 'r', **fbk)
plt.xlim(pi-.8,pi+.5)
plt.ylim(-.5,.5)

plt.savefig('fA.png')  # No edge lines
plt.savefig('fA.pdf')  # Edge lines!
Run Code Online (Sandbox Code Playgroud)

PNG结果

在此输入图像描述

PDF结果

在此输入图像描述

虽然它看似微不足道,但当你堆积200 块地块时,它变得极其成问题fill_between,你看到的只是一团丑陋的黑色!

Hoo*_*ked 10

它并不完美,但我找到了一个解决方案(并且如果有的话会接受更好的解决方案).显然后记可能是罪魁祸首:

...请注意,将线宽为0的行宽度解释为1像素宽线就是PostScript的作用.因此,为PostScript输出获得真正的零宽度的唯一方法是填充多边形而不进行描边.

解决方案是使edgecolor与facecolor相同.这可行,但如果facecolor具有透明度,则edgecolor似乎不会获得相同的透明度值.