Estoy tratando de averiguar cómo usar grconvertX/grconvertX en ggplot. Mi objetivo final es añadir anotaciones a una figura ggplot2 (y posiblemente celosía) con grid.text
y grid.lines
yendo de usuario en coordenadas del dispositivo. Sé que se puede hacer con grobs, pero me pregunto si hay una manera más fácil.Uso de grconvertX/grconvertY en ggplot2
El siguiente código me permite pasar valores de usuario en coordenadas NDC y utilizar dichos valores para anotar la parcela con grid.text
.
graphics.off() # close graphics windows
library(grid)
library(gridBase)
test= data.frame(
x = c(1,2,3),
y = c(12,10,3),
n = c(75,76,73)
)
par(mar = c(13,5,2,3))
plot(test$y ~ test$x,type="b", ann=F)
for (i in 1:nrow(test))
{
X=grconvertX(i , from="user", to="ndc")
grid.text(x=X, y =0.2, label=paste("GRID.text at\nuser.x=", i, "\n", "ndc.x=", (signif(X, 5)) ))
grid.lines(x=c(X, X), y = c(0.28, 0.33))
}
#add some code to save as PDF ...
El código se basa en la solución de uno de mis mensajes anteriores: Mixing X and Y coordinate systems. Puede ver cómo las coordenadas x del diagrama original se convirtieron a ndc. La ventaja de este enfoque es que puedo usar dispositivo coordenadas de Y.
asumí que fácilmente podría hacer lo mismo en ggplot2 (y posiblemente en celosía).
library(ggplot2)
graphics.off() # close graphics windows
qplot(x=x, y=y, data=test)+geom_line()+ opts(plot.margin = unit(c(1,3,8,1), "lines"))
for (i in 1:nrow(test))
{
X=grconvertX(i , from="user", to="ndc")
grid.text(x=X, y =0.2, label=paste("GRID.text at\nuser.x=", i, "\n", "ndc.x=", (signif(X, 5)) ))
grid.lines(x=c(X, X), y = c(0.28, 0.33))
}
#add some code to save as PDF...
Sin embargo, no funciona correctamente. Las coordenadas parecen estar un poco desconectadas. Las líneas verticales y el texto no se corresponden con las etiquetas de tic en la gráfica. ¿Alguien puede decirme cómo solucionarlo? Muchas gracias por adelantado.
Solo un aviso, he estado editando algunos formatos en sus preguntas para que quepan mejor con el uso "estándar" de marcado para resaltar el código.Además, es mejor no incluir líneas que eliminen todos los objetos del área de trabajo de un usuario en un código que las personas puedan copiar o pegar rápidamente. Deje que el lector se asegure de que estén en una sesión R limpia. – joran
Gracias! Pensé que sería más fácil trabajar en una sesión limpia. No añadiré este código nunca más. –