Me gustaría poner líneas verticales y etiquetas para las líneas verticales de cada gráfico en un bucle. la posición de la línea se guarda en una "cuadrícula" de trama de datos.

Aunque la posición de la línea parece correcta, el valor de la etiqueta y su posición está desactivada. Mi pregunta es por qué.

    library(ggplot2)
    library(grid)
    library(gridExtra)
    
    
    plots <- list()
    
    grid <- data.frame(x=seq(4), y=c(200, 400, 600, 800))
    
    for (i in 1:4) {
      V1 <- rnorm(1000)
      V2 <- seq(1000)
      df <- data.frame(V1, V2)
      
      plots[[i]] <- ggplot(df, aes(x= V2, y=V1)) +
        geom_point() +
      geom_vline(xintercept = grid[i,2], color="red")+ 
      geom_text(aes(x=grid[i,2], label=grid[i,2], y=3))
    
    }
    
    
    grid.arrange(grobs=plots, nrow=2)

enter image description here

1
Stata_user 26 jun. 2020 a las 14:47

3 respuestas

La mejor respuesta

Idealmente, debería usar annotate en su lugar. El siguiente código funciona como se esperaba.

library(ggplot2)
library(grid)
library(gridExtra)


plots <- list()

grid <- data.frame(x=seq(4), y=c(200, 400, 600, 800))

for (i in 1:4) {
  V1 <- rnorm(1000)
  V2 <- seq(1000)
  df <- data.frame(V1, V2)
  
  plots[[i]] <- ggplot(df, aes(x= V2, y=V1)) +
    geom_point() +
    geom_vline(xintercept = grid[i,2], color="red")+ 
    annotate("text", x=grid[i,2], label=grid[i,2], y=3)
  
}


grid.arrange(grobs=plots, nrow=2)

Creado en 2020-06-26 por el paquete de reprex (v0.3.0)

2
Peter H. 26 jun. 2020 a las 11:59

Tomaría un enfoque diferente, usando facetas.

También probablemente calcularía la muestra fuera de la faceta / bucle (segunda opción)

library(ggplot2)
grid_df<- data.frame(x=1:4, y=c(200, 400, 600, 800))

ggplot(grid_df) +
  geom_vline(aes(xintercept = y), color="red") +
  geom_text(aes(label = y, x = y, y = Inf), vjust = 1) +
  stat_function(
    inherit.aes = FALSE,
    fun = rnorm, 
    n = 600,
    alpha = 0.2,
    geom = "point"
  )+
  facet_wrap(~x, nrow = 2)


## or, if you want always the same sample in each facet: 
set.seed(42)
df_rnorm <- data.frame(V1 = rep(rnorm(1000), 4), V2 = rep(seq(1000), 4), x = rep(1:4, each = 1000))

ggplot(grid_df) +
  geom_vline(aes(xintercept = y), color="red") +
  geom_text(aes(label = y, x = y, y = Inf), vjust = 1) +
  geom_point(data = df_rnorm, aes(V2, V1), alpha = 0.2)+
  facet_wrap(~ x, nrow = 2)

Creado en 2020-06-26 por el paquete de reprex (v0.3.0)

1
Tjebo 26 jun. 2020 a las 12:18

Tuve que experimentar un poco para abordar la parte del por qué de tu pregunta. Y probablemente alguien más podría enriquecer mi explicación con un poco más de conocimiento experto y hechos (solo estoy respondiendo en base a mi instinto: D)

Como no parece haber ningún problema, si imprime los gráficos dentro del bucle o si los imprime fuera del bucle (dentro de otro bucle que itera 1: 4), creo que plot [[i]] solo almacena la sintaxis para producir el parcelas Si ejecuta la trama [[i]] fuera del bucle, utiliza la cuadrícula [i, 2] para asignar la etiqueta y la posición de la parte geom_text. Fuera del bucle i es 4 y es por eso que todas las parcelas usan la misma posición / etiqueta (800).

Pero realmente no entiendo por qué geom_vline no se comporta de la misma manera o por qué aes.inherit o el uso de lapply soluciona el problema ... Si alguien más pudiera arrojar algo de luz sobre esto, lo agradecería :)

        library(ggplot2)
        library(grid)
        library(gridExtra)
        
        plots <- list()
        
        grid <- data.frame(x=seq(4), y=c(200, 400, 600, 800))
        
        for (i in 1:4) {
            V1 <- rnorm(1000)
            V2 <- seq(1000)
            df <- data.frame(V1, V2)
            
            plots[[i]] <- ggplot(df, aes(x= V2, y=V1)) +
                geom_point() +
                geom_text(aes(x=grid[i,2], label=grid[i,2], y=3)) +
                geom_vline(xintercept = grid[i,2], color="red") 
                
            
            print(plots[[i]]) # not part of the original syntax
            
        }
        
        
        # leads to wrong position of geom_text
        plots
    
        # leads to wrong position of geom_text
        grid.arrange(grobs=plots, nrow=2)
        
        # correct position of geom_text
        for (i in 1:4){
            print(plots[[i]])
        }
        
        # new grid values also affect plots
        grid <- data.frame(x=seq(4), y=c(2000, 4000, 6000, 8000))
        
        # leads to wrong position of geom_text
        plots
        
        
0
sambold 28 jun. 2020 a las 10:53