Come tracciare tutte le colonne di un frame di dati in R

Il frame di dati ha n colonne e vorrei ottenere n grafici, un grafico per ogni colonna.

Sono un principiante e non parlo correntemente con R, comunque ho trovato due soluzioni.

Il primo funziona ma non stampa il nome della colonna (e ne ho bisogno!):

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

Il secondo funziona meglio perché stampa il nome della colonna:

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

C’è qualche soluzione migliore (dal punto di vista del linguaggio R)?

Il pacchetto ggplot2 richiede un po ‘di apprendimento, ma i risultati sono molto belli, si ottengono belle leggende e molte altre funzioni interessanti, il tutto senza dover scrivere molto codice.

 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 ~ .) 

inserisci la descrizione dell'immagine quiinserisci la descrizione dell'immagine qui

C’è un modo molto semplice per tracciare tutte le colonne da una cornice dati usando pannelli separati o lo stesso pannello:

 plot.ts(data) 

Quale rendimento (dove X1 – X4 sono nomi di colonne):

inserisci la descrizione dell'immagine qui

Hai visto? Plot.ts per tutte le opzioni.

Se non hai più controllo sulla tua funzione di tracciamento e non usi un ciclo, potresti anche fare qualcosa del tipo:

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

Puoi saltare i cerchi e convertire la tua soluzione in una lapply , sapply o apply . (Vedo che @jonw mostra un modo per farlo.) Oltre a ciò, quello che hai già è un codice perfettamente accettabile.

Se queste sono tutte serie temporali o simili, la seguente potrebbe essere un’alternativa adatta, che traccia ogni serie nel proprio pannello su una singola regione di tracciamento. Usiamo il pacchetto zoo in quanto gestisce molto bene i dati ordinati come questo.

 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) 

Che dà: Esempio di funzionalità di tracciamento di uno zoo

Sono sorpreso che nessuno abbia menzionato il matplot . È abbastanza comodo nel caso in cui non sia necessario tracciare ogni linea in assi separati. Un solo comando:

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

Usa ?matplot per vedere tutte le opzioni.

Per aggiungere la legenda, puoi impostare la tavolozza dei colors e quindi aggiungerla:

 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) 

Utilizzando alcuni dei suggerimenti di cui sopra (specialmente grazie a @daroczig per i names(df)[i] modulo) questa funzione stampa un istogramma per le variabili numeriche e un grafico a barre per le variabili fattoriali. Un buon inizio per esplorare un frame di dati:

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

I migliori auguri, Mat.

È ansible specificare il titolo (e anche il titolo degli assi tramite xlab e ylab ) con l’opzione main . Per esempio:

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

E se vuoi stampare (e salvare) ogni variabile di un dataframe, dovresti usare png , pdf o qualsiasi altro driver di grafica di cui hai bisogno, e dopo questo problema un comando dev.off() . Per esempio:

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

Oppure traccia tutti i grafici sulla stessa immagine con il parametro mfrow di par() . Ad esempio: usa par(mfrow=c(2,2) per includere i successivi 4 grafici nella stessa "immagine".

Non ho R su questo computer, ma qui c’è una crepa. È ansible utilizzare il par per visualizzare più grafici in una finestra, o in questo modo per richiedere un clic prima di visualizzare la pagina successiva.

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

Con latex :

 library(latex) 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) 

Nel caso in cui i nomi delle colonne nel file .csv non siano validi, il nome 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")