TransWikia.com

guardar gráficas en un for, R

Stack Overflow en español Asked by astronauta_estadístico on November 20, 2021

De antemano dar mis agradecimientos por las posibles respuestas

x1 <- c("A", "A","B", "B", "B", "A","A", "B", "A", "A")
x2 <- c("B", "A","A", "A", "B", "B","A", "A", "B", "B")
z1 <- rnorm(10, 70)
z2 <- rnorm(10, 1.7)
z3 <- rpois(10, 2)
df <- data.frame(x1,x2,z1,z2,z3)
  1. cómo se guarda una gráfica en un for, de tal forma que pueda invocar solo la gráfica 1 o 2 o 3, y que no salgan todas en una ventana

     par(mfrow = c(2, 2))
     for(i in 3:5) {
        plot(x = df[[1]], y = df[[i]],main=names(df[1]),
             col=c('lightblue', 'lightgreen'))
     }
    
  2. cómo puedo incluir un for, para que recorra las variables cualitativas df[1] y df[2] y que pueda invocar cualquier combinación del vector, df[3] o df[4] o df[5] con df[1] o df[2]

     example=function(k) {
     ggplot(df, aes(x = df[[k]], fill = df[[1]])) + geom_density(alpha = 0.5)+
     scale_x_continuous(limits=c(-50,80))+ labs(fill = names(df[k]))+ggtitle("variable", names(df[k]))
     }
    
     lapply(3:5,FUN=example)[3]
    

One Answer

Lamentablemente plot() no retorna el gráfico, éste se muestra como un efecto colateral de la función, por lo que para guardarnos los mismos deberemos hacer uso de recordPlot():

p <- list() # Una lista para guardar los gráficos
j <- 1
for(i in 3:5) {
  plot(x = df[[1]], y = df[[i]],main=names(df[1]),col=c('lightblue', 'lightgreen'))
  p[[j]] <- recordPlot() # Salvamos el gráfico en la lista
  plot.new() 
  j <- j + 1
}

p[[1]] # Grafico 1
p[[2]] # Grafico 2
p[[3]] # Grafico 3

Con respecto a tu otra pregunta, hay múltiples formas de resolverlo, se me ocurre rápidamente, preparar una función que reciba los nombres de las dos variables, cualitativa y cuantitativa:

graficar_df <- function(df, v1, v2) {
  
  ggplot(df, aes_string(x = v2, fill = v1)) + 
    geom_density(alpha = 0.5) +
    scale_x_continuous(limits = c(-50,80)) + 
    labs(fill = v2) +
    ggtitle("variable", v1)
         
}

El secreto es mapear las dimensiones gráficas mediante aes_string() que espera directamente las cadenas con los nombres de variable. Lo único que nos restaría hacer, es construir una tabla de combinaciones:

opciones <- expand.grid(names(df[,1:2]), names(df[,3:5]))
opciones

  Var1 Var2
1   x1   z1
2   x2   z1
3   x1   z2
4   x2   z2
5   x1   z3
6   x2   z3

Cada fila será una gráfica distinta, lo que resta es recorrer cada fila para hacer los gráficos:

apply(opciones, 1, function(r) graficar_df(df, r[1], r[2]))

Answered by Patricio Moracho on November 20, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP