web-dev-qa-db-fra.com

Comment tracer toutes les colonnes d'un bloc de données en R

Le bloc de données a n colonnes et j'aimerais obtenir n tracés, un tracé pour chaque colonne.

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

Le premier fonctionne mais il 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 affiche 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")

Existe-t-il de meilleures solutions (du point de vue du langage R)?

66
Alessandro Jacopson

Le ggplot2 Le package nécessite un peu d'apprentissage, mais les résultats ont l'air vraiment sympa, vous obtenez de belles légendes, ainsi que de nombreuses autres fonctionnalités de Nice, le tout 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 ~ .)

enter image description hereenter image description here

74
Prasad Chalasani

Il existe un moyen très simple de tracer toutes les colonnes d'un bloc de données à l'aide de panneaux distincts ou du même panneau:

plot.ts(data)

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

enter image description here

Regardez? Plot.ts pour toutes les options.

Si vous ne voulez plus contrôler votre fonction de traçage et n'utilisez pas de boucle, vous pouvez aussi faire quelque chose comme:

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

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

Si ce sont toutes des séries chronologiques ou similaires, la solution suivante peut être une alternative appropriée, qui trace chaque série dans son propre panneau sur une seule région de tracé. Nous utilisons le paquetage Zoo car il gère très bien les données commandées comme celle-ci.

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: Example of Zoo plotting capabilities

13
Gavin Simpson

Je suis surpris que personne n'ait mentionné matplot. C'est 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)

Utilisation ?matplot pour voir toutes les options.

Pour ajouter la légende, vous pouvez définir la palette de couleurs, puis l'ajouter:

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)
9
Rustam Guliev

En utilisant certaines des astuces ci-dessus (en particulier grâce à @daroczig pour la forme names(df)[i]), cette fonction imprime un histogramme pour les variables numériques et un diagramme à barres pour les variables factorielles. Un bon début pour explorer un bloc 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.

5
MatW

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)
3
Oscar Perpiñán

Je n'ai pas de R sur cet ordinateur, mais voici une fissure. Vous pouvez utiliser par pour afficher plusieurs tracés dans une fenêtre ou, comme ceci, 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)
3
J. Win.

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 sauvegarder) chaque variable d'une trame de données, vous devez utiliser png, pdf ou tout autre pilote graphique dont vous avez besoin, et après cette édition, un dev.off() commande. 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 parcelles sur la même image avec le paramètre mfrow de par(). Exemple: utilisez par(mfrow=c(2,2) pour inclure les 4 tracés suivants dans la même "image".

2
daroczig

Au cas où les noms de colonne dans le .csv fichier fichier non valide nom 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")
0