Question
J'ai un fichier séparé par des virgules contenant du nom foo.csv
les données suivantes:
scale, serial, spawn, for, worker
5, 0.000178, 0.000288, 0.000292, 0.000300
10, 0.156986, 0.297926, 0.064509, 0.066297
12, 2.658998, 6.059502, 0.912733, 0.923606
15, 188.023411, 719.463264, 164.111459, 161.687982
J'ai essentiellement deux questions:
1) Comment tracer la première colonne (axe x) par rapport à la seconde colonne (axe y)? J'essaie ceci (à la lecture ce site ):
data <- read.table("foo.csv", header=T,sep=",")
attach(data)
scale <- data[1]
serial <- data[2]
plot(scale,serial)
Mais je reçois cette erreur de retour:
Error in stripchart.default(x1, ...) : invalid plotting method
Toute idée de ce que je fais mal? Un recherche rapide sur Google révèle quelqu'un d'autre avec le même problème mais aucune réponse pertinente. MISE À JOUR: Il se trouve, il fonctionne très bien si je saute les deux déclarations d'affectation au milieu. Toute idée pourquoi est-ce?
La deuxième question suit assez facilement après la première:
2) Comment tracer la première colonne (axe x) par rapport à toutes les autres colonnes sur l'axe des y? Je présume qu'il est assez facile une fois que je reçois dans le premier problème que je cours dans, mais je suis un peu nouveau à R, donc je suis toujours envelopper ma tête autour.
La solution
Vous n'avez pas besoin les deux lignes:
scale <- data[1]
serial <- data[2]
échelle et de série sont déjà mis des en-têtes dans le read.table
.
En outre scale <- data[1]
crée un élément d'une data.frame
data[1]
1 5
2 10
3 12
4 15
alors que scale
du read.table
est un vecteur
5 10 12 15
et la fonction plot(scale, serial)
attend vecteur plutôt qu'une data.frame, vous avez juste besoin de faire
plot(scale, serial)
Une approche pour tracer les autres colonnes de données sur l'axe y:
plot(scale,serial, ylab="")
par(new=TRUE)
plot(scale,spawn,axes=F, ylab="", type="b")
par(new=TRUE)
plot(scale,for., axes=F, ylab="", type="b")
par(new=TRUE)
plot(scale,worker,axes=F, ylab="", type="b")
Il y a probablement de meilleures façons de le faire, mais qui est au-delà de mes connaissances actuelles de R ....
Autres conseils
Dans votre exemple,
plot(scale, serial)
ne fonctionnera pas parce scale
et serial
sont les deux trames de données, par exemple.
class(scale)
[1] "data.frame"
Vous pouvez essayer la points()
suivante et à l'utilisation, une fois que la parcelle a été généré, pour tracer les colonnes restantes. Attention, je le paramètre ylim
dans plot
pour accueillir la plage dans la troisième colonne.
data <- read.csv('foo.csv', header=T)
plot(data$scale, data$serial, ylim=c(0,750))
points(data$scale, data$spawn, col='red')
points(data$scale, data$for., col='green')
points(data$scale, data$worker, col='blue')
Je suis nouveau dans R, mais si vous voulez dessiner l'échelle par rapport à toutes les autres colonnes dans une parcelle, facile et avec une certaine élégance :) pour l'impression ou la présentation, vous pouvez utiliser les paquets de professeur Hadley Wickham ggplot2 et remodeler.
Installation:
install.packages(“ggplot2”,dep=T)
install.packages(“reshape”,dep=T)
Dessin votre exemple:
library(ggplot2)
library(reshape)
#read data
data = read.table("foo.csv", header=T,sep=",")
#melt data “scale vs. all”
data2=melt(data,id=c("scale"))
data2
scale variable value
1 5 serial 0.000178
2 10 serial 0.156986
3 12 serial 2.658998
4 15 serial 188.023411
5 5 spawn 0.000288
6 10 spawn 0.297926
7 12 spawn 6.059502
8 15 spawn 719.463264
9 5 for. 0.000292
10 10 for. 0.064509
11 12 for. 0.912733
12 15 for. 164.111459
13 5 worker 0.000300
14 10 worker 0.066297
15 12 worker 0.923606
16 15 worker 161.687982
#draw all variables at once as line with different linetypes
qplot(scale,value,data=data2,geom="line",linetype=variable)
Vous pouvez également utiliser des points (geom=”points”
), choisir différentes couleurs ou formes pour différentes variables (points colours=variable or shape=variable
), régler l'axe, définir les options individuelles pour chaque ligne, etc.
Lien vers documentation en ligne .
Je suis loin d'être un expert en R, mais je pense que vous avez besoin d'un data.frame:
plot(data.frame(data[1],data[2]))
Il fait au moins intrigue quelque chose sur ma configuration R!
Après des conseils dans la réponse de luapyad, je suis venu avec cela. Je renomme l'en-tête « échelle »:
scaling, serial, spawn, for, worker
5, 0.000178, 0.000288, 0.000292, 0.000300
10, 0.156986, 0.297926, 0.064509, 0.066297
12, 2.658998, 6.059502, 0.912733, 0.923606
15, 188.023411, 719.463264, 164.111459, 161.687982
alors:
foo <- read.table("foo.csv", header=T,sep=",")
attach(foo)
plot( scaling, serial );
Essayez ceci:
data <- read.csv('foo.csv')
plot(serial ~ scale, data)
dev.new()
plot(spawn ~ scale, data)
dev.new()
plot(for. ~ scale, data)
dev.new()
plot(worker ~ scale, data)
Il existe un moyen simple r de tracer le:
https://code.google.com/p/simple-r/
En utilisant ce script, il vous suffit de taper:
r -cdps, -k1:2 foo.csv
Pour obtenir le tracé que vous voulez. Mettez-le en mode verbose (-v) pour voir le script R correspondant.
data <- read.table(...)
plot(data$scale,data$serial)