Отображать собственное изображение как geom_point

Можно ли отображать пользовательское изображение (например, формат png) как geom_point в R ggplot?

library(png)
pic1 <- readPNG("pic1.png")

png("Heatmap.png", units="px", width=3200, height=3200, res=300)
ggplot(data_frame, aes(medium, day, fill = Transactions))  +
   geom_tile(colour="white")  +
   facet_grid(dime3_year~dime3_month) + 
   scale_fill_gradient(high="blue",low="white") +
   theme_bw() + 
   geom_point(aes(dime3_channel, day, size=Conv,alpha=Conv,image=(annotation_raster(pic1,xmin=0,ymin=0,xmax=5,ymax=5)),color="firebrick")) +

Выдает ошибку:

Не знаю, как автоматически выбрать масштаб для объекта типа proto / environment. По умолчанию используется непрерывная ошибка: эстетика должна иметь длину один или ту же длину, что и данные. Проблемы: (annotation_raster (conv_pic, xmin = 0, ymin = 0, xmax = 5, ymax = 5))


person Seth    schedule 24.12.2014    source источник
comment
Я бы начал с пакета grImport. Может потребоваться некоторая доработка сетки.   -  person joran    schedule 24.12.2014
comment
См. Также grImport2, например первый пример здесь или рис. 11 с lattice здесь. Хорошая статья о grImport здесь (см., Например, рис. 8, также с lattice).   -  person Henrik    schedule 25.12.2014
comment
см. также stackoverflow.com/questions/36133374/   -  person baptiste    schedule 23.03.2016
comment
и stackoverflow.com/a/36172385/471093   -  person baptiste    schedule 09.05.2016


Ответы (2)


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

(1) Прочтите пользовательские изображения, которые вы хотите отобразить,

(2) Визуализируйте растровые объекты в заданном местоположении, размере и ориентации с помощью функции rasterGrob(),

(3) Используйте функцию построения графика, например qplot(),

(4) Используйте геометрию, такую ​​как annotation_custom(), для использования в качестве статических аннотаций, определяющих грубые настройки для пределов x и y, как указано пользователем 20650.

Используя приведенный ниже код, я мог получить два пользовательских изображения img1.png и img2.png, расположенные с заданными xmin, xmax, ymin и ymax.

library(png)
library(ggplot2)
library(gridGraphics)
setwd("c:/MyFolder/")

img1 <- readPNG("img1.png")
img2 <- readPNG("img2.png")
g1 <- rasterGrob(img1, interpolate=FALSE)
g2 <- rasterGrob(img2, interpolate=FALSE)
qplot(1:10, 1:10, geom="blank") + 
  annotation_custom(g1, xmin=1, xmax=3, ymin=1, ymax=3) +
  annotation_custom(g2, xmin=7, xmax=9, ymin=7, ymax=9) +  
  geom_point()
person deb2015    schedule 24.12.2014
comment
Картинка результата была бы отличной - person Saren Tasciyan; 04.09.2020

Д.Л. Миллер предложил другое решение, используя ggproto(). https://github.com/dill/emoGG

library(ggplot2)
library(grid)
library(EBImage)
img <- readImage(system.file("img", "Rlogo.png", package = "png"))
RlogoGrob <- function(x, y, size, img) {
    rasterGrob(x = x, y = y, image = img, default.units = "native", height = size, 
        width = size)
}

GeomRlogo <- ggproto("GeomRlogo", Geom, draw_panel = function(data, panel_scales, 
    coord, img, na.rm = FALSE) {
    coords <- coord$transform(data, panel_scales)
    ggplot2:::ggname("geom_Rlogo", RlogoGrob(coords$x, coords$y, coords$size, 
        img))
}, non_missing_aes = c("Rlogo", "size"), required_aes = c("x", "y"), default_aes = aes(size = 0.05), 
    icon = function(.) {
    }, desc_params = list(), seealso = list(geom_point = GeomPoint$desc), 
    examples = function(.) {
    })

geom_Rlogo <- function(mapping = NULL, data = NULL, stat = "identity", 
    position = "identity", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, 
    ...) {
    layer(data = data, mapping = mapping, stat = stat, geom = GeomRlogo, 
        position = position, show.legend = show.legend, inherit.aes = inherit.aes, 
        params = list(na.rm = na.rm, img = img, ...))
}
ggplot(mtcars, aes(wt, mpg))+geom_Rlogo()
person Dr Duck    schedule 19.01.2017