2012-02-02 25 views
11

Tengo que generar 250 gráficas con la misma vista.Crear gráficos en un bucle usando ggplot2

mi ejemplo conjunto de datos:

df <- data.frame(name = c("john","alex","mike","dennis","alex"), 
      expenses = c("10","12","15","8","2"), 
      type = c("food","rent","rent","food","food")) 

me gustaría parcelas de barras con los gastos para cada nombre en una sola parcela. La trama de "Alex" se verá como:

selected.name <- "alex" 
df1 <- subset(df, name == selected.name) 
ggplot(data = df1, aes(type, expenses)) + geom_bar() 

Ahora quiero utilizar un bucle que traza la misma parcela para cada nombre en el df. Intenté usar un bucle for que ejecuta el código de la gráfica anterior como un archivo fuente. Pero no puedo pasar la variable de nombre al archivo de origen para que grafique el gráfico para cada nombre. Ahora solo obtengo un gráfico del bucle for.

+0

por favor especifique su pregunta un poco más. ¿Es tu problema que solo obtienes 1 ventana con 1 gráfico? que 'x11()' podría ser la solución. si quiere guardar archivos PDF, use 'pdf (archivo)' 'print (ggplot (...)' 'dev.off()' .... – Seb

+0

Hola Seb, gracias por la respuesta. Quiero crear un diagrama como la trama que creé para el nombre alex para cualquier otro nombre en df., sin tener que escribir manualmente los nombres. Porque en los datos reales hay 250 nombres. Espero que esto ayude. – jeroen81

+1

@Seb, preferiría ggsave en lugar de pdf(). –

Respuesta

15

Para responder a su pregunta original. Para ello se usa R estándar:

doPlot = function(sel_name) { 
    dum = subset(df, name == sel_name) 
    ggobj = ggplot(data = dum, aes(type, expenses)) + geom_bar() 
    print(ggobj) 
    ggsave(sprintf("%s.pdf", sel_name)) 
} 
lapply(unique(df$name), doPlot) 

De esta manera se termina con un gran número de archivos PDF llama Adam.pdf etc. A continuación, podría utilizar pdftk (caja de herramientas pdf) al gato los archivos en un solo documento. Todavía preferiría, una mejor solución usando, por ejemplo, Faceta o un tipo diferente de trama.

¿No sería mucho mejor usar facetas? Dada su ejemplo el código sería:

ggplot(data = df, aes(type, expenses)) + 
    geom_bar() + facet_wrap(~name) 

que conduce a la figura siguiente:

enter image description here

Tal vez para 250 nombres y más variables, esto podría ser un problema. Pero me gustaría ver facetas, no obstante.

+0

Gracias Paul, esta es una buena característica. Es útil para comparar las parcelas. En el real df hay 250 nombres y 12 variables de gastos. Esto generará una trama muy compleja. Estoy creando una herramienta de informes que genera todo tipo de KPI por empleado. Y no hacemos comparaciones en este informe. Por eso necesito todas las parcelas individuales. El informe generado con Latex/R sweave. – jeroen81

+1

Agregué una solución con parcelas individuales en pdf separado archivos a mi respuesta. –

+0

Gracias Paul, esto funciona perfecto para mí en este momento. Puedo adeptar las funciones más a mis necesidades. – jeroen81

1

Un colega acaba de señalar que usar un subconjunto en una función es una muy mala idea. Vea ?subset() para más información. Así que adapté el redactor de Paul Hiemstra y reemplacé el subconjunto.

doPlot = function(sel_name) { 
    dum <- df[df$name == sel_name,] 
    ggobj = ggplot(data = dum, aes(type, expenses)) + geom_bar() 
    print(ggobj) 
    ggsave(sprintf("%s.pdf", sel_name)) 
} 
lapply(unique(df$name), doPlot) 
+0

+1! Gran punto Subconjunto debería – marbel

Cuestiones relacionadas