Сохранение “тяжелого” числа к PDF в MATLAB - рендеринг проблемы

Я генерирую число в 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.

5
задан yuk 12 March 2010 в 15:39
поделиться

3 ответа

Это забавный вопрос. Ваша проблема не в 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 создал ваш файл размером 4 Мб!

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

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

2
ответ дан 15 December 2019 в 06:23
поделиться

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

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

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

1
ответ дан 15 December 2019 в 06:23
поделиться

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

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

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

0
ответ дан 15 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: