Como usar uma imagem como um ponto no ggplot?

Existe alguma maneira de usar uma pequena imagem específica como um ponto em um gráfico de dispersão com ggplot2. Idealmente, quero resize as imagens com base em uma variável.

Aqui está um exemplo:

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

Então eu basicamente quero saber se existe uma maneira de fornecer uma imagem específica como a forma?

Aqui está um geom minimalista para exibir imagens raster em vez de pontos,

 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() 

insira a descrição da imagem aqui

(saída do pacote ggflags)

Existe uma biblioteca chamada ggimage para fazer isso. Veja uma intro vinheta aqui

Você apenas tem que adicionar uma coluna ao seu data.frame com o endereço das imagens, que podem ser armazenadas na web ou localmente no seu computador e então você pode usar o 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) 

insira a descrição da imagem aqui

ps. Note que o ggimage depende do EBImage . Então, para instalar o gginamge eu tive que fazer isso:

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

Primeiro, aqui está sua resposta:

Para mostrar como usar melhor os widgets para representar a diferenciação de dados, refiro-me ao exemplo de faces de chernoff na galeria gráfica R.

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

Todo o código para gerar este exemplo está disponível no site.

Alternativamente, veja o stat_spoke de ggplot para um widget simples: alt text http://had.co.nz/ggplot2/graphics/706b1badf6469940342f204b7bc98857.png

O grImport fornece um mecanismo para importar imagens PDF simples para o seu lote para uso como pontos.

Agora segue uma crítica do seu exemplo.


Este não é um gráfico de dispersão. É essencialmente uma lista fluida de pontos de dados ordenados onde a cor é usada para indicar uma das variables ​​de texto, e um widget não-informativo e redundante foi usado para enquadrar os dados, mas não fornece feedback visual em termos de tamanho ou forma.

Não é um bom gráfico, porque falha completamente em responder à pergunta “Pagar mais, leva a melhores resultados”, e deixa o leitor com dificuldades para chegar a essa conclusão (e esse outro gráfico, se necessário) por si mesmos.

Além disso, os autores desperdiçaram os eixos x, y – que poderiam ter sido bem usados ​​para posicionar elementos por saída e resultados, para fornecer uma compreensão visual do valor pelo dinheiro. Em vez disso, optaram por ordenar os icons pela razão entre o custo per capita e a média da taxa de graduação, o que é útil, mas não responde à questão declarada e não permite uma comparação visual direta da proporção relativa entre faculdades ou a relação entre custo e valor.

Como eu digo, na minha opinião, este é um gráfico ruim, e seus leitores não seriam bem servidos por você replicá-lo.