2011-02-02 21 views
52

Tengo un marco de datos en R. El marco de datos tiene n columnas y me gustaría obtener n gráficos, un gráfico para cada columna.cómo trazar todas las columnas de un marco de datos en R

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 las necesito!):

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

La segunda se trabaja mejor, ya que 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)?

Gracias. Alessandro

+2

En su segundo segundo ejemplo, me inicializar el bucle como éste 'para (i en seq_along (DAT))' y tampoco llamaría 'datos 'a mis datos. –

+3

Su 'read.csv' se puede reducir a' read.csv ("sample.csv") 'ya que los otros argumentos se están ajustando a sus valores predeterminados. –

Respuesta

55

El paquete ggplot2 toma un poco de aprendizaje, pero los resultados se ven muy agradable, se obtiene buenos leyendas, además de muchas otras características interesantes, todo ello 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 here enter image description here

+0

Buena respuesta, pero ¿por qué necesita una remodelación? – eliasah

+0

@eliasah para el comando de fusión –

+0

Gracias @VerenaHaunschmid Lo he averiguado después :-) – eliasah

2

Se 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. Ej .:

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

Y si desea trazar (y guardar) cada una variable de una trama de datos, se debe utilizar png, pdf o cualquier controlador otros gráficos que necesita, y después de que emita un comando dev.off(). 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 llamar a todas las parcelas de la misma imagen con el parámetro de mfrow de par(). Por ejemplo: use par(mfrow=c(2,2) para incluir los siguientes 4 gráficos en la misma "imagen".

2

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

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

'apply' con' margin = 2' también habría funcionado, supongo. –

12

Puede pasar por el aro y convertir su solución a una llamada 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 de tiempo 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 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) 

cual da: Example of zoo plotting capabilities

27

Hay manera muy simple para trazar todas las columnas de una trama de datos usando paneles separados o el mismo panel:

plot.ts(data) 

que produce (donde X1 - X4 son nombres de columna):

enter image description here

Tenga en cuenta? Plot.ts para todas las opciones.

Si quieres probar un mayor control sobre la función de su trazado y no utiliza un bucle, también se podría hacer algo como:

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

Gracias, incluso si está relacionado con series de tiempo, creo que puede ayudarme a comprender mis datos. Me gusta un trazador de líneas! –

+4

Una pequeña nota: al agregar 'plot.type = c ("single")', su serie se traza en un solo gráfico, en lugar de cuadros separados: 'data <- data.frame (x = c (rnorm (10)), y = c (rnorm (10)), z = c (rnorm (10))) plot.ts (data, plot.type = c ("single"), lty = 1: 3) ' –

+0

@GeekOnAcid +1, muchas gracias por la sugerencia de "soltero". –

1

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) 
4

El uso de algunos de los consejos arriba (especialmente gracias @daroczig para el formulario names(df)[i]) esta función imprime un histograma para variables numéricas y un gráfico de barras para variables de factores. Un buen comienzo para explorar un marco de datos:

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])} 
    } 
} 

Best wishes, Mat.

1

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

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") 
+1

Como solo usa la primera fila de data2, sería más eficiente establecer 'nrows = 1' en' read.csv'. –

5

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

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

Uso ?matplot para ver todas las opciones.

Para añadir la leyenda, se puede establecer la paleta de colores y luego agregarlo:

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) 
+0

¿Qué es 'matlab.dark.palette', de dónde es? –

+1

@AlessandroJacopson es una función de paleta de colores que suelo usar. Es del paquete 'hyperSpec'. Pero sería mejor usar más funciones conocidas aquí, así que lo cambié a 'arco iris'. Si no conoce las funciones de la paleta, eche un vistazo a '? Rainbow'. Perdón por confundir. –

Cuestiones relacionadas