¿Cómo usar una imagen como un punto en ggplot?

¿Hay alguna forma de utilizar una imagen pequeña específica como un punto en un diagtwig de dispersión con ggplot2? Idealmente, querré redimensionar las imágenes en función de una variable.

Aquí hay un ejemplo:

library(ggplot2) p <- ggplot(mtcars, aes(wt, mpg)) p + geom_point(aes(size = qsec, shape = factor(cyl))) 

Entonces, básicamente, ¿quiero saber si hay una forma de suministrar una imagen específica como forma?

Aquí hay un geom minimalista para mostrar imágenes ráster en lugar de puntos,

 library(ggplot2) library(grid) ## replace by a named list with matrices to be displayed ## by rasterGrob .flaglist < - list("ar" = matrix(c("blue", "white", "blue"), 1), "fr" = matrix(c("blue", "white", "red"), 1)) flagGrob <- function(x, y, country, size=1, alpha=1){ grob(x=x, y=y, country=country, size=size, cl = "flag") } drawDetails.flag <- function(x, recording=FALSE){ for(ii in seq_along(x$country)){ grid.raster(x$x[ii], x$y[ii], width = x$size[ii]*unit(1,"mm"), height = x$size[ii]*unit(0.5,"mm"), image = .flaglist[[x$country[[ii]]]], interpolate=FALSE) } } scale_country <- function(..., guide = "legend") { sc <- discrete_scale("country", "identity", scales::identity_pal(), ..., guide = guide) sc$super <- ScaleDiscreteIdentity class(sc) <- class(ScaleDiscreteIdentity) sc } GeomFlag <- ggproto("GeomFlag", Geom, required_aes = c("x", "y", "country"), default_aes = aes(size = 5, country="fr"), draw_key = function (data, params, size) { flagGrob(0.5,0.5, country=data$country, size=data$size) }, draw_group = function(data, panel_scales, coord) { coords <- coord$transform(data, panel_scales) flagGrob(coords$x, coords$y, coords$country, coords$size) } ) geom_flag <- function(mapping = NULL, data = NULL, stat = "identity", position = "identity", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ...) { layer( geom = GeomFlag, mapping = mapping, data = data, stat = stat, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list(na.rm = na.rm, ...) ) } set.seed(1234) d <- data.frame(x=rnorm(10), y=rnorm(10), country=sample(c("ar","fr"), 10, TRUE), stringsAsFactors = FALSE) ggplot(d, aes(x=x, y=y, country=country, size=x)) + geom_flag() + scale_country() 

enter image description here

(salida del paquete ggflags)

Hay una biblioteca llamada ggimage para hacer eso. Vea una viñeta de introducción aquí

Solo tiene que agregar una columna a su data.frame con la dirección de las imágenes, que se puede almacenar en la web o localmente en su computadora y luego puede usar geom_image() :

 library("ggplot2") library("ggimage") # create a df set.seed(2017-02-21) d < - data.frame(x = rnorm(10), y = rnorm(10), image = sample(c("https://www.r-project.org/logo/Rlogo.png", "https://jeroenooms.github.io/images/frink.png"), size=10, replace = TRUE) ) # plot2 ggplot(d, aes(x, y)) + geom_image(aes(image=image), size=.05) 

enter image description here

PD. Tenga en cuenta que ggimage depende de EBImage . Entonces para instalar gginamge tuve que hacer esto:

 # install EBImage source("https://bioconductor.org/biocLite.R") biocLite("EBImage") # install ggimage install.packages("ggimage") 

Primero, aquí está tu respuesta:

Para mostrarte cómo usar la mejor manera de usar widgets para representar la diferenciación de datos, te remito al ejemplo de caras chernoff en la galería de gráficos R.

texto alternativo http://addictedtor.free.fr/graphiques/graphiques/graph_87.png

Todo el código para generar este ejemplo está disponible en el sitio.

Alternativamente, busque stat_spoke de ggplot para obtener un widget simple: texto alternativo http://had.co.nz/ggplot2/graphics/706b1badf6469940342f204b7bc98857.png

grImport proporciona un mecanismo para importar imágenes PDF simples en su ttwig para usarlas como puntos.

Ahora sigue una crítica de tu ejemplo.


Esto no es un diagtwig de dispersión. Básicamente es una lista fluida de puntos de datos ordenados donde el color se usa para indicar una de las variables de texto, y un widget no informativo y redundante se ha utilizado para enmarcar los datos, pero de lo contrario no proporciona retroalimentación visual en términos de tamaño o forma.

No es un buen gráfico, porque no responde por completo la pregunta planteada “¿Pagar más lleva a mejores resultados?”, Y deja al lector la dificultad de extraer esa conclusión (y ese otro gráfico, según sea necesario) por sí mismo.

Además, los autores han desperdiciado los ejes x, y, que podrían haber sido bien utilizados para posicionar los elementos por salientes y resultados, para proporcionar una comprensión visual de la relación calidad-precio. En cambio, han optado por ordenar los íconos por la relación entre el costo por cabeza y la tasa promedio de graduación, que es más o menos útil, pero no responde a la pregunta planteada, y no permite una comparación visual directa de la proporción relativa entre universidades, o la relación entre costo y valor.

Como digo, en mi opinión, este es un gráfico malo, y a sus lectores no les convendría que lo repliquen.