Линии триангуляции, видимые в заполненной сетке после печати в Matlab - PullRequest
2 голосов
/ 10 мая 2019

Я использовал скрипка для генерации (так называемых) скрипичных сюжетов в Matlab.График выглядит хорошо: screenshot from the figure

Однако, печать его (как в pdf, так и в svg) приводит к файлу, в котором видны линии триангуляции (увеличенный, чтобы подчеркнуть):screenshot from pdf

Думаю, это какая-то проблема с настройками zbuffer этих строк или что-то в этом роде.Под капотом violin просто использует fill() таким способом, который кажется вполне законным:

 h(i)=fill([F(:,i)+i;flipud(i-F(:,i))],[U(:,i);flipud(U(:,i))],fc,'FaceAlpha',alp,'EdgeColor',lc);

Замена fill на patch не решает проблему!Минимальный, полный и проверяемый пример:

a=randn(10000,1);
[f, u, bb]=ksdensity(a,'bandwidth',0.2);
figure; fill([f'+i;flipud(i-f')],[u';flipud(u')],'b','FaceAlpha',1);
print(gcf,'-dpdf','a.pdf'); % bad
print(gcf,'-dsvg','a.svg'); % bad
figure; patch([f'+i;flipud(i-f')],[u';flipud(u')],'b','FaceAlpha',1);
print(gcf,'-dpdf','b.pdf'); % bad
print(gcf,'-dsvg','b.svg'); % bad

Результат: result of the minimal example

Моя версия R2017a.

1 Ответ

0 голосов
/ 13 мая 2019

Вот пример использования патча для создания одного многоугольника, представляющего внешнюю часть фигуры.

theta = linspace(0,2*pi,100);
r = sqrt(1.125+cos(theta*2));
y = r.*cos(theta);
x = r.*sin(theta);
subplot(121)
plot(x,y);

subplot(122)
h = patch(x,y,'r','edgecolor','none');
...