Сохранение вывода одного из встроенных примеров 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 также будет страдать от той же проблемы.
Вероятно, это результат сглаживания: когда вы показываете изображение, оно рисует квадраты по одному. Когда они рисуются, край представляет собой смесь цветов квадрата и белого фона, поэтому он прорисовывается светлее.
К сожалению, это не то, что действительно находится под вашим контролем. Артефакты появляются в средстве предварительного просмотра 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). Может быть, кто-то еще может показать нам в комментарии.
Я считаю, что функция ggplot2::geom_contour_filled рисует их таким образом, поэтому она дает лучшие результаты. Я посмотрю, смогу ли я изменить свой ответ, чтобы показать, что вам нужно сделать.
Это отвечает на мой вопрос. Жаль, что база R не может этого сделать.
Учитывая, что вывод PNG в порядке, разве вы не должны просить исправления в средстве предварительного просмотра PDF? Вот где ошибка.
Это не превьюер. Когда я открываю filled.contour PDF в Inkscape, он выглядит как набор прямоугольников. Вывод ggplot::geom_contour_filled выглядит хорошо в окне предварительного просмотра, потому что он не состоит из прямоугольников.
Вы ошибаетесь в двух отношениях: вывод ggplot2 показывает тот же эффект в другом месте: вы можете видеть светлые края полигональных областей. Они не так раздражают, как светлые края прямоугольников, но все равно являются ошибкой. Если Inkscape показывает проблему, когда вы рисуете темный прямоугольник рядом с темным прямоугольником, у него та же ошибка, что и у средства предварительного просмотра, которое я использую. Они должны делать сглаживание, но не так, как они это делают.
Я думаю, что мы говорим о разных проблемах здесь. Первая проблема — алиасинг. Как упоминалось в документации по функции pdf, все программы для просмотра pdf в Linux и MacOS страдают от этой проблемы. Вторая проблема заключается в ненужном разбиении закрашенных контурных участков на маленькие прямоугольники. Эта проблема возникает только в базе R, а не в ggplot2. Но, конечно, вы правы в том, что ggplot2 не застрахован от псевдонимов в других местах.
Да, векторное изображение состоит из множества маленьких квадратиков. Это кажется довольно неэффективным способом сохранения заполненного контурного графика. Значит, нельзя использовать контуры как многоугольники и заливать их сплошным цветом?