2016-03-24 1 views
1

Это сообщение связано с question Я спросил пару дней назад, и конкретно об этом post (из которого я одолжил код ниже). Я чувствовал, что это требует нового вопроса, потому что это новый вопрос.R: Создание списка png-растеров, чтение в grid.raster

Я пытаюсь построить график в ggplot2 с настраиваемыми изображениями для geom_point, а затем вставить эти изображения в легенду. Однако, когда я помещаю растровые изображения в список и ссылочные элементы этого списка в grid.raster, он выдает ошибку. Есть ли способ сохранить png-растры в списке, чтобы их можно было вызвать из grid.raster позже? Вот пример ...

library(png) 
library(ggplot2) 
library(grid) 

# Get image 
img <- readPNG(system.file("img", "Rlogo.png", package="png")) 

# Grab online image 
url <- "https://www.rstudio.com/wp-content/uploads/2014/06/RStudio-Ball.png" 
destfile <- "myfile.png" 
r_studio <- download.file(url, destfile, mode="wb") 
r_studio <- readPNG("myfile.png") 

# Put images in list  
image_list <- list(img, r_studio) 

# Plot 
p = ggplot(mtcars, aes(mpg, disp, colour = factor(vs))) + 
    geom_point() + 
    theme(legend.key.size = unit(1, "cm")) 

# Get ggplot grob 
gt = ggplotGrob(p) 
grid.newpage() 
grid.draw(gt) 


# Search using regular expressions 
Tree = as.character(current.vpTree()) 
pos = gregexpr("\\[key.*?\\]", Tree) 
match = unlist(regmatches(Tree, pos)) 

match = gsub("^\\[(key.*?)\\]$", "\\1", match) # remove square brackets 
match = match[!grepl("bg", match)] # removes matches containing bg 

# Loop through image list. Change the legend keys to images 
for(i in 1:2){ 
downViewport(match[i]) 
grid.rect(gp=gpar(col = NA, fill = "white")) 
grid.raster(image_list[i], interpolate=FALSE) 
upViewport(0) 
} 

Когда я запускаю этот последний цикл я получаю следующую ошибку

Error in UseMethod("as.raster") : 
no applicable method for 'as.raster' applied to an object of class "list" 

Я заметил, что ввод изображений в список изменяется тип из двойного в список, так что я Думаю, это связано с этим.

typeof(img) 
[1] "double" 
typeof(image_list[1]) 
[1] "list" 

ответ

1

Вы получаете эту ошибку, потому что путь вы Подмените image_list, когда вы делаете image_list[i], вы должны пойти один уровень глубже, добавив дополнительную пару [] т.е. image_list[[i]], чтобы получить массив (изображение)

library(png) 
library(ggplot2) 
library(grid) 

# Get image 
img <- readPNG(system.file("img", "Rlogo.png", package="png")) 

# Grab online image 
url <- "https://www.rstudio.com/wp-content/uploads/2014/06/RStudio-Ball.png" 
destfile <- "myfile.png" 
r_studio <- download.file(url, destfile, mode="wb") 
r_studio <- readPNG("myfile.png") 

#Create the object `img`: your example code above does not do this 
img <- r_studio 

# Put images in list  
image_list <- list(img, r_studio) 

# Plot 
p = ggplot(mtcars, aes(mpg, disp, colour = factor(vs))) + 
    geom_point() + 
    theme(legend.key.size = unit(1, "cm")) 

# Get ggplot grob 
gt = ggplotGrob(p) 
grid.newpage() 
grid.draw(gt) 

# Search using regular expressions 
Tree = as.character(current.vpTree()) 
pos = gregexpr("\\[key.*?\\]", Tree) 
match = unlist(regmatches(Tree, pos)) 

match = gsub("^\\[(key.*?)\\]$", "\\1", match) # remove square brackets 
match = match[!grepl("bg", match)] # removes matches containing bg 

# Loop through image list. Change the legend keys to images 
for(i in 1:2){ 
downViewport(match[i]) 
grid.rect(gp=gpar(col = NA, fill = "white")) 
grid.raster(image_list[[i]], interpolate=FALSE) 
upViewport(0) 
} 
Смежные вопросы