studio - superponer graficas en r ggplot
¿Cómo usar una imagen como un punto en ggplot? (3)
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()
(salida del paquete ggflags)
¿Hay alguna forma de utilizar una imagen pequeña específica como un punto en un diagrama 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?
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)
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 stat_spoke 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 trama para usarlas como puntos.
Ahora sigue una crítica de tu ejemplo.
Esto no es un diagrama 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.