11

在 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结果

在此处输入图像描述

PDF 结果

在此处输入图像描述

虽然看起来微不足道,但当你堆叠 200 个地块时,它变得非常fill_between有问题,你所看到的只是一团难看的黑色!

4

2 回答 2

10

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

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

解决办法是让edgecolor和facecolor一样。这可行,但如果 facecolor 具有透明度,则 edgecolor 似乎没有获得相同的透明度值。

于 2013-01-03T17:04:39.473 回答
1

它一点也不漂亮,但如果你将它设置为 None,它会抛出这个错误:

回溯(最后一次调用):文件“/usr/local/lib/python2.7/site-packages/matplotlib/artist.py”,第 59 行,>in draw_wrapper draw(artist, renderer, *args, **kwargs ) 文件“/usr/local/lib/python2.7/site-packages/matplotlib/figure.py”,第 1085 行,>in draw func(*args) 文件“/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”,行 > 2110,在 draw a.draw(renderer) 文件“/usr/local/lib/python2.7/site-packages/matplotlib/artist.py”,第 59 行,> 在 draw_wrapper draw(artist , 渲染器, *args, **kwargs) 文件“/usr/local/lib/python2.7/site-packages/matplotlib/lines.py”,第 694 行,>在 draw gc.set_linewidth(self._linewidth) TypeError: a float is required

并继续在没有线的情况下进行渲染。堆叠的小提琴图现在可以与 Seaborn 一起使用!

0.0 线宽:

0.0 线宽

无:

使用无

于 2015-04-06T22:34:57.010 回答