2015-02-04 3 views
5

Я пытаюсь экспортировать заполненные контурные графики из Matlab в виде векторной графики, чтобы включить в файл латекса. Моя текущая методология:Matlab: Как избежать артефактов в заполненных контурных участках

contourf(x,y,v_mag,20), axis([0,width,0,height]),daspect('manual') ; 
grid off 
colormap jet 
h = colorbar; 
caxis([0 v_lid]) 
h.Label.String = 'Velocity Magnitude (m/s)'; 
set(gcf,'renderer','painters') 
export_fig('-painters', '-transparent', 'pdf', 'filename.pdf'); 

Проблема этого метода состоит в том, что она производит артефакты (белые линии), которые выглядят следующим образом: Artefacts in PDFs produces from Matlab

Я понимаю, что эти белые линии являются многоугольники, определяющие затененных областей, которые имеют невидимые края, и не совсем перекрывают (according to here). Проблема вызвана самой программой просмотра pdf, которая пытается сгладить строки, отображаемые на экране (according to here). Моя проблема в том, что большинство людей, просматривающих документ, не узнают об этом и не будут знать, как запретить зрителю делать это. Итак, мои вопросы:

Возможно ли создать векторную графику заполненного контурного графика из Matlab без этих артефактов?

Eps производит те же проблемы. Я попытался использовать SVG function, но не повезло. Я стараюсь избегать использования растровой графики из-за пикселизации, вызванной масштабированием. Любые советы будут высоко оценены.

EDIT - Дополнительная информация - Использование Matlab v.2014b и Ghostscript v.9.15

+0

Выполняются ли эти изменения при увеличении и уменьшении масштаба в программе просмотра PDF? –

+0

Да, они меняются. При масштабировании они исчезают. После увеличения они меняются. – 1QuickQuestion

+1

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

ответ

1

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

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

  1. Выведите версию фигуры без линий в формате png с достаточно высоким разрешением.

  2. Вывести версию рисунка без цветов в формате pdf. Это не должно быть никаких артефактов. Если ваша фигура сложна и имеет много прозрачных пленок, вам может потребоваться вывести несколько версий, наращивающих «уровни».

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

  4. Наложение двух изображений в Illustrator. Вывод в векторном формате.

Это также позволяет использовать такие вещи, как способность Illustrator сжимать pdf-файлы.

Если вы не хотите играть с векторизации растрового выхода, вы также можете просто заменить шаги 3-4 и объединить растровое цветное изображение с векторным изображением линии. Это будет хорошо работать для сложных контурных графиков, дающих вам четкие линии, но способность сжимать основные цвета.

1

В конце концов, MatLab 2013b не имеет этой проблемы. Кроме того, файлы, которые он производит, имеют гораздо меньший объем.Это потому, что MatLab 2013b представляет собой векторизованное изображение больших перекрывающихся фигур, в то время как MatLab 2014b делает эту ужасную сетку.

enter image description here

Здесь первый файл завелась с 2013b и второй с MatLab 2014b (я выделил один из полигонов с красным инсультом, чтобы показать разницу). Объемы различаются примерно в 22 раза (38 Kb против 844 Kb).

Так что это не проблема зрителя, это то, как изображение экспортируется из MatLab.

Вопрос также обсуждается здесь Triangular split patches with painters renderer in MATLAB 2014b and above, но все еще нет прямого решения.