Cómo trazar todas las columnas de un dataframe en R

El dataframe tiene n columnas y me gustaría obtener n gráficos, un gráfico para cada columna.

Soy un novato y no soy fluido en R, de todos modos encontré dos soluciones.

El primero funciona, pero no imprime el nombre de la columna (¡y los necesito!):

data <- read.csv("sample.csv",header=T,sep=",") for ( c in data ) plot( c, type="l" ) 

El segundo funciona mejor porque imprime el nombre de la columna:

 data <- read.csv("sample.csv",header=T,sep=",") for ( i in seq(1,length( data ),1) ) plot(data[,i],ylab=names(data[i]),type="l") 

¿Hay alguna solución mejor (desde el punto de vista del lenguaje R)?

El paquete ggplot2 requiere un poco de aprendizaje, pero los resultados se ven muy bien, obtienes bonitas leyendas, además de muchas otras funciones interesantes, todo sin tener que escribir mucho código.

 require(ggplot2) require(reshape2) df <- data.frame(time = 1:10, a = cumsum(rnorm(10)), b = cumsum(rnorm(10)), c = cumsum(rnorm(10))) df <- melt(df , id.vars = 'time', variable.name = 'series') # plot on same grid, each series colored differently -- # good if the series have same scale ggplot(df, aes(time,value)) + geom_line(aes(colour = series)) # or plot on different plots ggplot(df, aes(time,value)) + geom_line() + facet_grid(series ~ .) 

enter image description hereenter image description here

Hay una manera muy simple de trazar todas las columnas de un dataframe usando paneles separados o el mismo panel:

 plot.ts(data) 

Qué rendimientos (donde X1 – X4 son nombres de columna):

enter image description here

Mira “plot.ts” para todas las opciones.

Si no quieres tener más control sobre tu función de trazado y no utilizar un lazo, también puedes hacer algo como:

 par(mfcol = c(ncol(data), 1)) Map(function(x,y) plot(x, main =y), data, names(data)) 

Puede saltar a través de aros y convertir su solución en una lapply , sapply o apply . (Veo que @jonw muestra una forma de hacer esto). Aparte de eso, lo que ya tienes es un código perfectamente aceptable.

Si se trata de series temporales o similares, la siguiente podría ser una alternativa adecuada, que grafica cada serie en su propio panel en una sola región de trazado. Usamos el paquete del zoo ya que maneja datos ordenados como este muy bien.

 require(zoo) set.seed(1) ## example data dat <- data.frame(X = cumsum(rnorm(100)), Y = cumsum(rnorm(100)), Z = cumsum(rnorm(100))) ## convert to multivariate zoo object datz <- zoo(dat) ## plot it plot(datz) 

Lo que da: Ejemplo de capacidades de trazado de zoológico

Me sorprende que nadie haya mencionado matplot . Es muy conveniente en caso de que no necesite trazar cada línea en ejes separados. Solo un comando:

 matplot(y = data, type = 'l', lty = 1) 

Usa ?matplot para ver todas las opciones.

Para agregar la leyenda, puede establecer la paleta de colores y luego agregarla:

 mypalette = rainbow(ncol(data)) matplot(y = data, type = 'l', lty = 1, col = mypalette) legend(legend = colnames(data), x = "topright", y = "topright", lty = 1, lwd = 2, col = mypalette) 

Usando algunos de los consejos anteriores (especialmente gracias a @daroczig para el formulario de names(df)[i] ) esta función imprime un histogtwig para variables numéricas y un gráfico de barras para variables de factores. Un buen comienzo para explorar un dataframe:

 par(mfrow=c(3,3),mar=c(2,1,1,1)) #my example has 9 columns dfplot <- function(data.frame) { df <- data.frame ln <- length(names(data.frame)) for(i in 1:ln){ mname <- substitute(df[,i]) if(is.factor(df[,i])){ plot(df[,i],main=names(df)[i])} else{hist(df[,i],main=names(df)[i])} } } 

Mis mejores deseos, Mat.

Puede especificar el título (y también el título de los ejes a través de xlab y ylab ) con la opción main . P.ej:

 plot(data[,i], main=names(data)[i]) 

Y si desea trazar (y guardar) cada variable de un dataframe, debe usar png , pdf o cualquier otro controlador de gráficos que necesite, y luego emitir un dev.off() . P.ej:

 data <- read.csv("sample.csv",header=T,sep=",") for (i in 1:length(data)) { pdf(paste('fileprefix_', names(data)[i], '.pdf', sep='') plot(data[,i], ylab=names(data[i]), type="l") dev.off() } 

O dibuja todos los trazados en la misma imagen con el mfrow de par() . Por ejemplo: use par(mfrow=c(2,2) para incluir los siguientes 4 gráficos en la misma "imagen".

No tengo R en esta computadora, pero aquí hay un crack. Puede usar par para mostrar múltiples trazados en una ventana, o de esta manera para solicitar un clic antes de mostrar la siguiente página.

 plotfun <- function(col) plot(data[ , col], ylab = names(data[col]), type = "l") par(ask = TRUE) sapply(seq(1, length(data), 1), plotfun) 

Con lattice :

 library(lattice) df <- data.frame(time = 1:10, a = cumsum(rnorm(10)), b = cumsum(rnorm(10)), c = cumsum(rnorm(10))) form <- as.formula(paste(paste(names(df)[- 1], collapse = ' + '), 'time', sep = '~')) xyplot(form, data = df, type = 'b', outer = TRUE) 

En caso de que los nombres de columna en el archivo de archivo .csv no sean válidos, nombre de R:

 data <- read.csv("sample.csv",sep=";",head=TRUE) data2 <- read.csv("sample.csv",sep=";",head=FALSE,nrows=1) for ( i in seq(1,length( data ),1) ) plot(data[,i],ylab=data2[1,i],type="l")