Сохранение «тяжелой» фигуры в PDF в MATLAB - проблема рендеринга - PullRequest
5 голосов
/ 11 марта 2010

Я создаю фигуру в MATLAB с большим количеством элементов (100000+) и хочу сохранить ее в файл PDF. С zbuffer или рендером живописцев у меня есть очень большой и медленно открываемый файл (более 4 Мб) - все точки в векторном формате Используя рендерер OpenGL, растеризуйте рисунок в PDF, хорошо для графика, но не подходит для текстовых меток. Размер файла составляет около 150 Кб.

Попробуйте этот упрощенный код, например:

x=linspace(1,10,100000);
y=sin(x)+randn(size(x));
plot(x,y,'.')
set(gcf,'Renderer','zbuffer')
print -dpdf -r300 testpdf_zb
set(gcf,'Renderer','painters')
print -dpdf -r300 testpdf_pa
set(gcf,'Renderer','opengl')
print -dpdf -r300 testpdf_op

Фактическая цифра намного сложнее с несколькими осями и разными типами графиков.

Есть ли способ растеризовать фигуру, но сохранить текстовые метки как векторы?

Другая проблема с OpenGL состоит в том, что он не работает в терминальном режиме (-nosplash -nodesktop -nodisplay) под Mac OSX. Похоже, OpenGL не поддерживается. Я должен использовать режим терминала для автоматизации. Я запускаю версию MATLAB 2007b. Сервер Mac OSX 10.4.

Ответы [ 3 ]

2 голосов
/ 11 марта 2010

Это забавно. Ваша проблема не в Matlab, а в Ghostscript (Matlab создает PDF-файлы, вызывая Ghostscript, по крайней мере в Windows). Когда я бегу

x=linspace(1,10,100000);
y=sin(x)+randn(size(x));
plot(x,y,'.')
print -dpsc2 test.ps

У меня есть файл PS размером 2 МБ (конечно же, весь вектор), который при сжатии превратился в ZIP-файл размером 164 КБ. Можно было бы ожидать более-менее такой же результат при преобразовании PS в PDF, но ps2pdf test.ps произвело ваш файл 4Mb!

Поскольку вы работаете на Mac, возможно, у вас установлен Distiller. Я бы попробовал & mdash; генерировать PS-файлы, как указано выше, а затем запускать их через Distiller; Вы должны получить 150K векторный PDF.

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

1 голос
/ 12 марта 2010

Если вы не хотите использовать двухмерную гистограмму (т. Е. Изображение, где яркость пикселей соответствует плотности точек), как подсказывает BlessedKey , похоже, что единственный хороший способ - выполнить растеризацию. себя, как упомянуто AB .

getframe , за которым следует frame2im , кажется, путь для этого. К сожалению, getframe возвращается пустым, если вы запускаете с -nodisplay. Поэтому вам нужно сохранить рисунок как .fig, а на другом компьютере запустить скрипт, который открывает рисунок, получает содержимое осей с помощью getframe, отображает изображение из getframe и затем сохраняет в pdf.

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

0 голосов
/ 12 марта 2010

Если это вообще возможно, вы должны попытаться проиллюстрировать свою проблему перед построением иллюстрации.Если вы рисуете точки на кривой, то 10000, вероятно, больше, чем вам нужно.Современный принтер всего лишь около 600 точек на дюйм.

Если точки иллюстрируют облако с некоторыми свойствами плотности, лучшим решением может быть сначала построить двумерную гистограмму и проиллюстрировать это с помощью imshow или imagesc.

Если несколько облаков показаны разными цветами, вам может быть интересно создать одно такое изображение для каждого облака и объединить их с прозрачностью.

...