Как создать миниатюры в R? - PullRequest
2 голосов
/ 31 марта 2011

Я пытаюсь создать файл .png с графиком R. Это прекрасно работает:

png(file="hello.png", width=1000, height=800)

# Lots and lots of plotting. Long code. Very slow.
plot(x=c(1, 2, 3), y=c(4, 6, 5))

dev.off()

Теперь, как я могу получить миниатюру hello.png непосредственно от R?

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

Я не уверен, как это будет масштабироваться для вашего реального приложения, и у меня нет большого опыта работы с библиотекой png, но в моих тестовых примерах это работало достаточно быстро.Вам нужно указать имя PNG-файла, из которого вы хотите сделать эскиз, и высоту / ширину этого эскиза.По умолчанию он сохранит миниатюру в том же каталоге с thumb_ перед именем файла.

makeThumb <- function(file, height, width) {
  require(png)
  img <- readPNG(file)

  png(file = paste("thumb", file, sep = "_"), height = height, width = width)
    par(mar=c(0,0,0,0), xaxs="i", yaxs="i", ann=FALSE)
    plot(1:2, type='n', xaxt = "n", yaxt = "n", xlab = "", ylab = "")
    lim <- par()
    rasterImage(img, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])
  dev.off()
}

Дайте мне знать, если это работает для вас.Функция хорошо работает с lapply для одновременной работы с большим количеством файлов в каталоге: lapply(listOfFiles, makeThumb, height = 200, width = 200).

2 голосов
/ 01 апреля 2011

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

#wrap your plotting code into a function
my_plot <- function()
{
  #whatever
}

plot_file_name <- "hello.png"
png(file = plot_file_name, width = 1000, height = 800)
my_plot()
dev.off()

png(file = paste("thumb", plot_file_name, sep = "_"), width = 40, height = 32)
my_plot()
dev.off()

Этот метод лучше работает с lattice или ggplot2, где my_plot может вернуть объект графика, поэтомуВам не нужно вызывать функцию дважды, т. е. вы вызываете

a_plot <- myplot()
png(...)
print(a_plot)
dev.off()

РЕДАКТИРОВАТЬ: Есть несколько различных способов «масштабирования».Вот пример рабочего процесса ggplot2.

Нарисуйте и сохраните свой график

myplot <- function()
{
  #e.g.,
  ggplot(cars, aes(speed, dist)) + geom_point()
}

the_plot <- myplot()

ggsave("full plot.png", the_plot)    

Возможно, вы хотите обновить размеры geom, чтобы они стали меньше

scale_factor <- 0.1
update_geom_defaults("point", aes(size = 2 * scale_factor))

Вы можете использовать1018 * из пакета ggExtra, чтобы отображать только содержимое панели (т. Е. Игнорировать оси, заголовки и условные обозначения).

ggsave("thumbnail panel only.png", the_plot + opts_full(), scale = scale_factor)

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

theme_mini <- theme_grey(12 * scale_factor)
theme_mini$axis.ticks.length <- scale_factor * theme_mini$axis.ticks.length   
theme_mini$axis.ticks.margin <- scale_factor * theme_mini$axis.ticks.margin
theme_mini$panel.margin <- scale_factor * theme_mini$panel.margin 
theme_mini$plot.margin <- scale_factor * theme_mini$plot.margin
#and probably some more elements to resize

ggsave("thumbnail updated theme.png", the_plot + theme_mini, scale = scale_factor)
1 голос
/ 01 апреля 2011

Вы можете использовать dev.copy утилиту:

png("plot_large.png",1000,1000)
dev.control("enable")

# ..... start of plot section .....
plot(rnorm(100))
# ..... end of plot section .....

dev.copy(png, filename="plot_small.png", width=100, height=100)
dev.off()
dev.off()

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

Вторая вещь - примечание на dev.copy странице справки:

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

И третье - это не совсем миниатюра, потому что размер png определяет некоторые параметры (вот почему вы получили ошибку «слишком большие поля»). Так что лично я думаю, что вы должны использовать внешний инструмент для обработки изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...