MATLAB: видны края патчей после экспорта в виде векторной графики

Патчи в Matlab склеиваются из отдельных треугольников. Их края обычно не видны, но когда я экспортирую рисунок в формат векторной графики, они хорошо видны (показана не вся картинка, а только увеличенная часть)

ребра отдельных треугольников

Код для создания этого MWE:

xx = [0:1:100, 100:-1:0];
yy = [zeros(1,101), ones(1,101)];
p1 = patch(xx,yy,'b'); 
print('testPatch','-dpdf','-painters')

Альтернативная функция fill ведет себя так же. Есть ли способ избежать этой ошибки или в этом случае мне придется жить с растровыми изображениями?

РЕДАКТИРОВАТЬ: Один из способов обхода — заштриховать область, а не заполнять ее. Это, очевидно, не всегда возможно, но в моем случае это сработало хорошо, и я мог придерживаться векторной графики. Соответствующее представление FEX: http://www.mathworks.com/matlabcentral/fileexchange/30733-hatchfill


person FliegenderZirkus    schedule 23.04.2015    source источник
comment
Я не уверен, что вызывает это, но я наблюдал подобное поведение при экспорте графиков с круглыми маркерами. Круглые маркеры в конечном итоге выглядят как неоднородные многоугольники, состоящие из нескольких треугольников.   -  person Ryan J. Smith    schedule 23.04.2015
comment
Я думаю, что проблема, которую вы описываете, имеет простое решение: не используйте «o» в качестве типа маркера, а используйте «.». Насколько я помню, это помогло мне.   -  person FliegenderZirkus    schedule 23.04.2015
comment
Я никогда не устану рекомендовать export_fig от Matlab FEX. Он отлично справляется с экспортом данных, намного лучше, чем сам Maltab. попробуй.   -  person Ander Biguri    schedule 23.04.2015
comment
Андер, спасибо за подсказку. Я также регулярно использую export_fig, но это никак не влияет на эту проблему. Проблема связана с визуализатором 'painters', который также используется export_fig для создания векторной графики.   -  person FliegenderZirkus    schedule 23.04.2015
comment
@AnderBiguri: К сожалению, export_fig test.pdf -painters выдает тот же фрагментарный вывод. У меня была своя доля горя с векторным выводом Matlab, и я отказался от попыток убедить Matlab создавать красивые фигуры. Вместо этого я сохраняю в формате eps, а затем редактирую его в Illustrator или Inkscape, чтобы исправить шрифты, ширину линий и т. д.   -  person Martin J.H.    schedule 23.04.2015
comment
@МартинДж.Х. Обычно я кодирую ширину линий шрифтов... с кодом Matlab или открываю графические редакторы. В моем случае, как правило, это помогает   -  person Ander Biguri    schedule 23.04.2015
comment
Очень странно - у меня пример работает с Matlab 2013b; но с новым движком прорисовки 2014b, (даже с опциями отключения новой графики) похоже что-то сломалось   -  person chepyle    schedule 24.04.2015
comment
До 2014b Matlab экспортировал каждый патч как отдельный полигон. Теперь он разбивает каждый патч на несколько треугольников. Эта политика обсуждается здесь mathworks.com/matlabcentral/answers/, но сотрудники Mathworks обвиняют Adobe вместо того, чтобы признать, что они нарушили экспорт векторной графики.   -  person Trisoloriansunscreen    schedule 16.06.2015
comment
@chepyle - какие это варианты...? Мне любопытно...   -  person Dev-iL    schedule 29.11.2015
comment
@ Dev-iL Мне нужно было использовать свойства фигуры GraphicsSmoothing и Renderer , установив для них значения 'off' и 'painters' соответственно.   -  person chepyle    schedule 30.11.2015


Ответы (3)


plot2svg позволяет создавать файлы векторной графики (SVG) с непрерывными патчами. Я также буду следить за обновлениями export_fig, похоже, что Яир Альтман работает над этой проблемой. Не задержал бы дыхание для решения от The Mathworks.

person Trisoloriansunscreen    schedule 16.06.2015

Вывод разбросанной векторной графики (срезы, треугольники, прямоугольники вместо объединенных объектов) — одна из секретных функций после обновления графического движка R2014b.

Я смог соединить эти треугольники вместе с помощью следующего скрипта Python, который использует системный вызов Inkscape https://github.com/Sbte/fix_matlab_eps. Но это обходной путь, который работает для простых сюжетов. Это не решение.

Либо используйте растровый вывод, либо сохраните свои данные и используйте программное обеспечение python matplot.

person Community    schedule 15.04.2016

Это раздражает. Единственный ответ, который я видел от Matlab, заключается в том, что это связано со сглаживанием в вашей программе просмотра PDF. Это подробно обсуждается здесь: https://www.mathworks.com/matlabcentral/answers/162257-problem-with-patch-graphics-in-2014b-splits-in-two-along-diagonal

Mathworks рекомендует изменить параметры программы просмотра PDF, как описано здесь: https://www.stata.com/support/faqs/graphics/line-artifacts-in-filled-contour-plot/ В случае, если ссылка не работает, вот ключевая информация: Вот инструкции по отключению сглаживания в некоторых популярных программах просмотра PostScript и PDF:

  • GSView: в меню «Медиа» › «Настройки дисплея» измените «Графика альфа» на «1 бит».
  • Adobe Reader 9 и 10: В меню Adobe Reader › «Настройки...» выберите панель «Отображение страницы», снимите флажок «Использовать ускорение 2D-графики» и снимите флажок «Гладкая штриховая графика».
  • Adobe Illustrator: В Illustrator › Настройки... › Общее меню, снимите флажок «Обложка со сглаживанием».
  • Mac Preview: в меню Preview › Preferences... выберите панель «PDF» и снимите флажок «Smooth text and line art».
  • FoxIt Reader: Файл>Настройки>Отображение страницы, снимите флажок с плавными линиями.

Это работает для меня в большинстве случаев, но, как сказал один из участников обсуждения Mathworks, мы не можем ожидать, что наши коллеги изменят настройки программы просмотра PDF для просмотра наших графиков.

Это похоже на жизнеспособный обходной путь (использование скрипта с Adobe Illustrator или Inkscape+python для объединения исправлений): https://github.com/dfarrel1/fix_matlab_vector_graphics

person Tom F    schedule 22.12.2020