为啥 matplotlib fill_between 只在 PDF 上绘制边缘线?

Posted

技术标签:

【中文标题】为啥 matplotlib fill_between 只在 PDF 上绘制边缘线?【英文标题】:Why does matplotlib fill_between draw edgelines only on a PDF?为什么 matplotlib fill_between 只在 PDF 上绘制边缘线? 【发布时间】:2012-12-18 01:29:37 【问题描述】:

在 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 地块时,它会变得极度成问题,您所看到的只是一团难看的黑色!

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

Traceback(最近一次调用最后一次): 文件“/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 行,> 绘制 函数(*参数) 文件“/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,绘制 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 线宽:

没有:

【讨论】:

以上是关于为啥 matplotlib fill_between 只在 PDF 上绘制边缘线?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 matplotlib.PatchCollection 会弄乱补丁的颜色?

为啥 matplotlib 中的图例不能正确显示颜色?

为啥使用 matplotlib 无法正确显示 CIFAR-10 图像?

为啥这个混淆矩阵(matplotlib)在 Jupyter Notebook 中看起来被压扁了? [复制]

Matplotlib 为啥我点击后绘图功能会在按钮内绘制?

尝试使用 matplotlib 内联绘图时,为啥在 jupyter notebook 中出现 NonGuiException?