Подтвердить что ты не робот

Почему matplotlib fill_between рисовать edgelines только в PDF?

В 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 графиков, все, что вы видите, является уродливым беспорядком черного!

4b9b3361

Ответ 1

Это не идеально, но я нашел решение (и приеду лучше, если оно придет). Видимо, может быть виноват постскриптум:

... обратите внимание, что интерпретация ширины линии нуля как 1 Широкая линия пикселя - это то, что делает PostScript. Таким образом, единственный способ получить истинную нулевую ширину для вывода PostScript, чтобы заполнить полигон без поглаживания.

Решение состоит в том, чтобы сделать edgecolor таким же, как с facecolor. Это работает, но если у facecolor есть прозрачность, кажется, что edgecolor не получает того же значения прозрачности.

Ответ 2

Это совсем не красиво, но если вы установите его на None, это вызовет эту ошибку:

Traceback (последний последний вызов):  Файл "/usr/local/lib/python2.7/site-packages/matplotlib/artist.py" , строка 59, > в draw_wrapper    draw (artist, renderer, * 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    draw (artist, renderer, * args, ** kwargs)  Файл "/usr/local/lib/python2.7/site-packages/matplotlib/axes/_base.py", строкa > 2110, в розыгрыше    a.draw(рендерер)  Файл "/usr/local/lib/python2.7/site-packages/matplotlib/artist.py" , строка 59, > в draw_wrapper    draw (artist, renderer, * 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

с None:

Using None