Comment tracer toutes les colonnes d’un bloc de données dans R

Le bloc de données a n colonnes et je voudrais obtenir n tracés, un tracé pour chaque colonne.

Je suis un débutant et je ne parle pas couramment le R, de toute façon j’ai trouvé deux solutions.

Le premier fonctionne, mais n’imprime pas le nom de la colonne (et j’en ai besoin!):

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

Le second fonctionne mieux car il imprime le nom de la colonne:

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

Y a-t-il des solutions meilleures (du sharepoint vue du langage R)?

Le paquetage ggplot2 un peu d’apprentissage, mais les résultats sont vraiment sympas, vous obtenez de belles légendes, ainsi que de nombreuses autres fonctionnalités intéressantes, sans avoir à écrire beaucoup de code.

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

entrer la description de l'image icientrer la description de l'image ici

Il existe un moyen très simple de tracer toutes les colonnes d’un bloc de données en utilisant des panneaux distincts ou le même panneau:

 plot.ts(data) 

Quels rendements (où X1 – X4 sont des noms de colonnes):

entrer la description de l'image ici

Avez-vous regardé? Plot.ts pour toutes les options.

Si vous ne voulez plus contrôler votre fonction de traçage et ne pas utiliser de boucle, vous pouvez également faire quelque chose comme:

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

Vous pouvez passer à travers les cerceaux et convertir votre solution en un lapply , sapply ou apply . (Je vois @jonw montre une façon de faire cela). En dehors de cela, ce que vous avez déjà est un code parfaitement acceptable.

S’il s’agit d’une série chronologique ou similaire, les éléments suivants peuvent constituer une alternative appropriée, qui trace chaque série dans son propre panneau sur une seule région de traçage. Nous utilisons le paquet zoo car il gère très bien les données ordonnées comme cela.

 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) 

Qui donne: Exemple de capacités de traçage de zoo

Je suis surpris que personne matplot mentionné le matplot . C’est assez pratique si vous n’avez pas besoin de tracer chaque ligne dans des axes distincts. Juste une commande:

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

Utilisez ?matplot pour voir toutes les options.

Pour append la légende, vous pouvez définir la palette de couleurs, puis l’append:

 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) 

En utilisant certains des conseils ci-dessus (en particulier grâce à @daroczig pour les names(df)[i] ), cette fonction imprime un histogramme pour les variables numériques et un graphique à barres pour les variables factorielles. Un bon début pour explorer une trame de données:

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

Meilleurs voeux, Mat.

Vous pouvez spécifier le titre (ainsi que le titre des axes via xlab et ylab ) avec l’option main . Par exemple:

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

Et si vous voulez tracer (et enregistrer) chaque variable d’un dataframe, vous devez utiliser png , pdf ou tout autre pilote graphique dont vous avez besoin, puis émettre une commande dev.off() . Par exemple:

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

Ou dessinez toutes les plots sur la même image avec le mfrow mfrow de par() . Par exemple: utilisez par(mfrow=c(2,2) pour inclure les 4 prochaines plots dans la même "image".

Je n’ai pas R sur cet ordinateur, mais voici une fissure. Vous pouvez utiliser par pour afficher plusieurs tracés dans une fenêtre, ou comme ceci pour demander un clic avant d’afficher la page suivante.

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

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

Si les noms de colonne dans le .csv fichier .csv ne sont pas valides, R name:

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