90 votes

comment tracer toutes les colonnes d'un bloc de données dans R

J'ai un bloc de données dans R. Le bloc de données a n colonnes et je voudrais obtenir un n parcelles, une parcelle de terrain pour chaque colonne.

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

Le premier fonctionne, mais il ne peut pas imprimer 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 parce qu'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")

Est-il mieux (à partir de la R de la langue du point de vue) des solutions?

Je vous remercie. Alessandro

101voto

Prasad Chalasani Points 9020

Le package ggplot2 demande 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, le tout sans avoir à écrire beaucoup de code.

 require(ggplot2)
require(reshape)
df <- data.frame(time = 1:10,
                 a = cumsum(rnorm(10)),
                 b = cumsum(rnorm(10)),
                 c = cumsum(rnorm(10)))
df <- melt(df ,  id = '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 ~ .)
 

entrez la description de l'image icientrez la description de l'image ici

47voto

Matti Pastell Points 4244

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 colonne):

entrez la description de l'image ici

Jetez un œil à? Plot.ts pour toutes les options.

Si vous ne contrôlez pas davantage votre fonction de traçage et n'utilisez pas 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))
 

15voto

Gavin Simpson Points 72349

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

Si elles sont toutes une série de temps ou similaire, alors ce qui suit peut être une solution de rechange, qui les parcelles de chaque série dans son propre panneau sur un seul tracé région. Nous utilisons l' zoo du paquet poignées de données classées comme très bien en effet.

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)

Ce qui donne: Example of zoo plotting capabilities

9voto

MatW Points 70

En utilisant certaines des astuces ci-dessus (en particulier merci @daroczig pour le formulaire 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.

3voto

daroczig Points 11126

Vous pouvez spécifier le titre (et aussi le titre des axes via xlab et ylab) avec l' main option. E. g.:

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

Et si vous voulez tracer (et enregistrer) pour chaque variable d'un dataframe, vous devez utiliser png, pdf ou tout autre graphique pilote dont vous avez besoin, et après que le numéro un dev.off() commande. E. g.:

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 de dessiner toutes les parcelles de la même image avec l' mfrow paramater d' par(). E. g.: utiliser par(mfrow=c(2,2) d'inclure les 4 parcelles dans la même "image".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X