Сохранение заполненных контурных графиков в PDF в R дает пиксельные результаты

Сохранение вывода одного из встроенных примеров R для функции filled.contour в PDF:

pdf('test.pdf')
require("grDevices")
filled.contour(volcano, asp = 1)
dev.off()

Дает дискретный результат (см. ниже). Есть ли способ исправить это? Системная информация:

> sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 20.04.1 LTS

Изменить после принятого ответа:

На самом деле проблема описана в документации функции pdf:

If you see problems with PDF output, do remember that the
problem is much more likely to be in your viewer than in R ... 
Symptoms for which the viewer has been at fault are apparent 
grids on image plots ...
    
Unfortunately the default viewers on most Linux and macOS 
systems have these problems, and no obvious way to turn off 
graphics anti-aliasing.

Это странное место для документирования проблемы, потому что разделение на прямоугольные сегменты явно вызвано filled.contour, а не pdf. В противном случае вывод ggplot2 также будет страдать от той же проблемы.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
474
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

К сожалению, это не то, что действительно находится под вашим контролем. Артефакты появляются в средстве предварительного просмотра PDF. Смотрите эту страницу https://codedocean.wordpress.com/2014/02/03/anti-aliasing-and-image-plots/ для обсуждения.

Мне там сработала рекомендация: используйте png() устройство с type = "cairo". Это дает растровый вывод, а не векторный вывод pdf().

png('test.png',type = "cairo")
filled.contour(volcano, asp = 1)
dev.off()

Отредактировано, чтобы добавить:

Я не думаю, что вы можете добиться большего успеха с filled.contour, но если вы хотите переключиться на графику ggplot2, вы можете. Когда он рисует заполненные контуры, кажется, что он использует многоугольники, а не график в стиле image, который использует filled.contour. Это по-прежнему показывает те же ошибки сглаживания в предварительном просмотре, но теперь линии появляются вдоль границ между цветами, что гораздо меньше раздражает. Например:

df <- data.frame(x = as.numeric(row(volcano)-1)/(nrow(volcano)-1),
                 y = as.numeric(col(volcano)-1)/(ncol(volcano)-1),
                 z = as.numeric(volcano))    
pdf('test.pdf')
library(ggplot2)
ggplot(df, aes(x=x, y=y, z=z)) + 
  geom_contour_filled()
dev.off()

Я не знаю, как получить такую ​​же палитру, какую использует filled.contour, т.е. function(n) hcl.colors(n, "YlOrRd", rev = TRUE). Может быть, кто-то еще может показать нам в комментарии.

Да, векторное изображение состоит из множества маленьких квадратиков. Это кажется довольно неэффективным способом сохранения заполненного контурного графика. Значит, нельзя использовать контуры как многоугольники и заливать их сплошным цветом?

janonime 19.12.2020 12:10

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

user2554330 19.12.2020 14:16

Это отвечает на мой вопрос. Жаль, что база R не может этого сделать.

janonime 19.12.2020 18:22

Учитывая, что вывод PNG в порядке, разве вы не должны просить исправления в средстве предварительного просмотра PDF? Вот где ошибка.

user2554330 20.12.2020 11:52

Это не превьюер. Когда я открываю filled.contour PDF в Inkscape, он выглядит как набор прямоугольников. Вывод ggplot::geom_contour_filled выглядит хорошо в окне предварительного просмотра, потому что он не состоит из прямоугольников.

janonime 20.12.2020 23:49

Вы ошибаетесь в двух отношениях: вывод ggplot2 показывает тот же эффект в другом месте: вы можете видеть светлые края полигональных областей. Они не так раздражают, как светлые края прямоугольников, но все равно являются ошибкой. Если Inkscape показывает проблему, когда вы рисуете темный прямоугольник рядом с темным прямоугольником, у него та же ошибка, что и у средства предварительного просмотра, которое я использую. Они должны делать сглаживание, но не так, как они это делают.

user2554330 21.12.2020 00:11

Я думаю, что мы говорим о разных проблемах здесь. Первая проблема — алиасинг. Как упоминалось в документации по функции pdf, все программы для просмотра pdf в Linux и MacOS страдают от этой проблемы. Вторая проблема заключается в ненужном разбиении закрашенных контурных участков на маленькие прямоугольники. Эта проблема возникает только в базе R, а не в ggplot2. Но, конечно, вы правы в том, что ggplot2 не застрахован от псевдонимов в других местах.

janonime 21.12.2020 15:13

Другие вопросы по теме