¿Cómo dibujar una línea en un entorno de figuras múltiples en R?

Tome un ejemplo muy simple, mfrow=c(1,3) ; cada figura es un histogtwig diferente; ¿Cómo dibujaría una línea horizontal (similar a abline(h=10) ) que abline(h=10) las 3 figuras? (Es decir, incluso los márgenes entre ellos.) Obviamente, podría agregar una abline a cada figura, pero eso no es lo que quiero. Puedo pensar en una forma muy complicada de hacer esto al tener solo 1 figura y dibujar cada ‘figura’ dentro de ella usando un polygon etc. Eso sería ridículo. ¿No hay una manera fácil de hacer esto?

Como señaló @joran, el sistema gráfico de cuadrícula ofrece un control más flexible sobre la disposición de múltiples trazados en un solo dispositivo.

Aquí, primero uso grconvertY() para consultar la ubicación de una altura de 50 en el eje y en unidades de “coordenadas de dispositivo normalizadas”. (es decir, como una proporción de la altura total del dispositivo de trazado, con 0 = abajo y 1 = arriba). Luego uso las funciones de la grilla para: (1) presionar una viewport que llena el dispositivo; y (2) trace una línea a la altura devuelta por grconvertY() .

 ## Create three example plots par(mfrow=c(1,3)) barplot(VADeaths, border = "dark blue") barplot(VADeaths, border = "yellow") barplot(VADeaths, border = "green") ## From third plot, get the "normalized device coordinates" of ## a point at a height of 50 on the y-axis. (Y <- grconvertY(50, "user", "ndc")) # [1] 0.314248 ## Add the horizontal line using grid library(grid) pushViewport(viewport()) grid.lines(x = c(0,1), y = Y, gp = gpar(col = "red")) popViewport() 

enter image description here

EDITAR : @joran preguntó cómo trazar una línea que se extiende desde el eje y de la primera ttwig hasta el borde de la última barra en la tercera ttwig. Aquí hay un par de alternativas:

 library(grid) library(gridBase) par(mfrow=c(1,3)) # barplot #1 barplot(VADeaths, border = "dark blue") X1 <- grconvertX(0, "user", "ndc") # barplot #2 barplot(VADeaths, border = "yellow") # barplot #3 m <- barplot(VADeaths, border = "green") X2 <- grconvertX(tail(m, 1) + 0.5, "user", "ndc") # default width of bars = 1 Y <- grconvertY(50, "user", "ndc") ## Horizontal line pushViewport(viewport()) grid.lines(x = c(X1, X2), y = Y, gp = gpar(col = "red")) popViewport() 

enter image description here

Finalmente, aquí hay un enfoque casi equivalente y más útil en general. Emplea las funciones grid.move.to() y grid.line.to() demostradas por Paul Murrell en el artículo vinculado a la respuesta de @mdsumner:

 library(grid) library(gridBase) par(mfrow=c(1,3)) barplot(VADeaths); vps1 <- do.call(vpStack, baseViewports()) barplot(VADeaths) barplot(VADeaths); vps3 <- do.call(vpStack, baseViewports()) pushViewport(vps1) Y <- convertY(unit(50,"native"), "npc") popViewport(3) grid.move.to(x = unit(0, "npc"), y = Y, vp = vps1) grid.line.to(x = unit(1, "npc"), y = Y, vp = vps3, gp = gpar(col = "red")) 

Esto es lo mejor que puedo hacer sin pensarlo más difícilmente:

 par(mfrow = c(1,3),xpd = NA) for (i in 1:3){ x <- rnorm(200,i) hist(x) if (i == 1) segments(par("usr")[1],10,30,10) } 

enter image description here

No estoy seguro de cómo asegurarme de que la línea termina en el lugar correcto sin retoques. Trazar un segmento en cada región resolvería eso, pero introduce el problema de tener las alturas alineadas correctamente. Pero este podría ser un buen punto de partida, al menos.

Supongo que esto es más fácil en gráficos de cuadrícula , pero tendría que investigar un poco para verificarlo.

Este artículo de Paul Murrell muestra el uso de gráficos de grid para dibujar líneas entre dos sistemas de coordenadas diferentes, en este caso líneas que tienen puntos finales especificados en el espacio nativo de dos subplotlas separadas:

Paul Murrell. El paquete de gráficos de cuadrícula R News, 2 (2): 14-19, junio de 2002

Está en la página 17 del artículo en PDF:

http://cran.r-project.org/doc/Rnews/Rnews_2002-2.pdf