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

时间:2013-01-03 16:35:19

标签: python pdf matplotlib png

在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!

PNG结果

enter image description here

PDF结果

enter image description here

虽然看似微不足道,但当你堆叠200 fill_between个图时,它会变成非常有问题,所有你看到的都是丑陋的黑色!

2 个答案:

答案 0 :(得分:10)

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

  

...请注意将线宽为零解释为1   像素宽线是PostScript的作用。所以唯一的方法   获得一个真正的零宽度的PostScript输出就是填充   多边形而不抚摸它。

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

答案 1 :(得分:1)

它根本不漂亮,但是如果你把它设置为None,它会抛出这个错误:

  

追踪(最近一次通话):    文件" /usr/local/lib/python2.7/site-packages/matplotlib/artist.py" ;,第59行,>在draw_wrapper中      画(艺术家,渲染器,* args,** kwargs)    文件" /usr/local/lib/python2.7/site-packages/matplotlib/figure.py" ;,第1085行,>抽奖      FUNC(*参数)    文件" /usr/local/lib/python2.7/site-packages/matplotlib/artist.py" ;,第59行,>在draw_wrapper中      画(艺术家,渲染器,* args,** kwargs)    文件" /usr/local/lib/python2.7/site-packages/matplotlib/axes/_base.py" ;, line> 2110,平局      a.draw(渲染)    文件" /usr/local/lib/python2.7/site-packages/matplotlib/artist.py" ;,第59行,>在draw_wrapper中      画(艺术家,渲染器,* args,** kwargs)    文件" /usr/local/lib/python2.7/site-packages/matplotlib/lines.py" ;,第694行,>在抽奖中      gc.set_linewidth(self._linewidth)   TypeError:需要浮点数

并继续渲染没有线。堆积的小提琴图现在与Seaborn一起工作!

0.0线宽:

with 0.0 linewidth

没有:

Using None