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