studio - ggplot2 tutorial
Agregar una ventana transparente/ojo de cerradura ggplot2(cuadrĂcula) (3)
A veces es útil usar una técnica para agregar una capa gris semitransparente a una imagen y luego cortar un ojo de cerradura en esa capa para resaltar una cierta parte de la imagen a continuación. Aquí hay un ejemplo de un videojuego de youtube :
A veces lo hago con gráficos, pero uso Inkscape para agregar una capa semitransparente y luego uso el borrador para cortar un agujero en esa capa. Este (a) parece menos que profesional (b) requiere tiempo adicional y un programa separado y (c) posible pérdida de calidad.
Quiero hacerlo en R. Estoy preguntando por ggplot2 porque esta es mi herramienta preferida, pero creo que cualquier respuesta de cuadrícula sería buena (sé que la base probablemente tiene un enfoque muy diferente).
Así que aquí hay un MWE en el que he agregado un geom_rect
para mostrar dónde queremos cortar el ojo de la cerradura / ventana:
ggplot(mtcars, aes(mpg, wt)) +
geom_point(size=3) +
geom_rect(mapping=aes(xmin=20, xmax=25,
ymin=3, ymax=3.3), color="black", alpha=.01)
¿Cómo puedo usar R para hacer una trama que se parece a esto?
¿Qué tal lo siguiente?
P <- ggplot(mtcars, aes(mpg, wt)) + geom_point(size=3)
## Set the limits for x & y
xlims <- c(20, 25)
ylims <- c(3, 3.3)
# Where P is the original plot
P + geom_rect(mapping=aes(xmin=-Inf, xmax=min(xlims), ymin=-Inf, ymax=+Inf), fill="black", alpha=.01) +
geom_rect(mapping=aes(xmin=min(xlims), xmax=+Inf, ymin=max(ylims), ymax=+Inf), fill="black", alpha=.01) +
geom_rect(mapping=aes(xmin=min(xlims), xmax=+Inf, ymin=-Inf, ymax=min(ylims)), fill="black", alpha=.01) +
geom_rect(mapping=aes(xmin=max(xlims), xmax=+Inf, ymin=min(ylims), ymax=max(ylims)), fill="black", alpha=.01)
Resulta que puedes hacer esto con grid.path(...)
en el paquete de grid
. Lea la documentation para ver cómo crear una ruta con un agujero en ella.
library(gridExtra)
library(ggplot2)
ggp <- ggplot(mtcars, aes(mpg, wt)) + geom_point(size=3)
grid.newpage()
grid.draw(arrangeGrob(ggp))
grid.path(c(0,0,1,1,.48,.48,.62,.62),
c(0,1,1,0,.43,.50,.50,.43),
id=rep(1:2, each=4),
rule="evenodd",gp=gpar(fill="black", alpha=0.6))
NB: grid.draw(...)
y grid.path(...)
están en el paquete de grid
; arrangeGrob(...)
está en el paquete gridExtra
. Cargando gridExtra
hace que se cargue la grid
. Gracias a @MartinBel por sugerir la edición.
En respuesta al comentario de @BrandonBertelsen: grid.path(...)
es agnóstico sobre la forma; Sólo tienes que proporcionar las coordenadas.
center <- c(x=0.55,y=0.48)
r <- 0.1
circle <- do.call(rbind,lapply(seq(0,2*pi,length=36),
function(th)c(x=r*cos(th),y=r*sin(th))))
circle <- data.frame(circle)
circle$x <- circle$x + center["x"]
circle$y <- circle$y + center["y"]
ggp <- ggplot(mtcars, aes(mpg, wt)) + geom_point(size=3)
grid.newpage()
grid.draw(arrangeGrob(ggp))
grid.path(c(0,0,1,1,circle[,1]),
c(0,1,1,0,circle[,2]),
id=c(1,1,1,1,rep(2,nrow(circle))),
rule="evenodd",gp=gpar(fill="black", alpha=0.6))
El "círculo" es una elipse debido a la relación de aspecto de la ventana de trazado.
Más información: No es lo que dibujas, es lo que no dibujas por Paul Murrell en el R Journal
require(ggplot2)
#represent some tiles based on your axes (10 x 10, by 1) deoending on resolution you want
alpha_tiles<-expand.grid(x=0:10,y=0:10,a=0.6)
#set alpha to 0 for the coordinate
alpha_tiles[alpha_tiles$x %in% 7:9 & alpha_tiles$y==7,]$a<-0
qplot(0:10,0:10, size=10, color="red") + theme_bw() +
geom_raster(data=alpha_tiles,aes(x=x,y=y), alpha=alpha_tiles$a, fill="grey")
o esto para una respuesta más completa que deja en blanco toda la trama:
require(ggplot2)
#represent some tiles based on your axes (here 100 x 100, by 1) depending on resolution you want
resolution<-100
alpha_tiles<-expand.grid(x=0:resolution,y=0:resolution,a=0.6)
#set alpha to 0 for the coordinates to highlight
alpha_tiles[alpha_tiles$x %in% 40:70 & alpha_tiles$y %in% 70:80,]$a<-0
alpha_tiles[alpha_tiles$x %in% 10:30 & alpha_tiles$y %in% 10:25,]$a<-0
p<-qplot(0:10,0:10, size=10, color="red") + theme_bw() # background plot
qplot(0:resolution,0:resolution,geom="blank") + theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
plot.background=element_blank()) +
annotation_custom(ggplotGrob(p),0,resolution,0,resolution) +
geom_raster(data=alpha_tiles,aes(x=x,y=y), alpha=alpha_tiles$a, fill="grey")