2009-05-18 11 views
18

J'ai un fichier séparé par des virgules contenant du nom foo.csv les données suivantes:Traçage des données simples dans R

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 (X- axe) par rapport à la deuxième colonne (axe des y)? J'essaie ceci (à la lecture this 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 quick Google search révèle quelqu'un d'autre avec le même problème mais aucune réponse pertinente. MISE À JOUR: Il s'avère que cela fonctionne bien si je saute les deux instructions d'affectation au milieu. Une idée de pourquoi c'est?

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 suppose que c'est assez facile une fois que je contournerai le premier problème que je rencontre, mais je suis juste un peu nouveau à R alors je suis toujours en train de l'emballer.

Répondre

11

Vous n'avez pas besoin les deux lignes:

scale <- data[1] 
serial <- data[2] 

que l'échelle et de série sont déjà définis dans les en-têtes dans le read.table.

également scale <- data[1] crée un élément d'une data.frame

data[1] 
1  5 
2 10 
3 12 
4 15 

alors scale du read.table est un vecteur

5 10 12 15 

et la fonction plot(scale, serial) plutôt que vecteur attend un data.frame, de sorte que vous venez besoin de faire

plot(scale, serial) 

Une approche pour tracer les autres colonnes de données sur l'axe des 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 ....

+0

Alors, à quoi devrait ressembler son appel à plot()? –

+0

il suffit d'utiliser plot (échelle, série) – luapyad

+0

Malheureusement, "échelle" semble être un global de quelque sorte. –

2

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!

En suivant les conseils de la réponse de luapyad, j'ai trouvé 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); 
2

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) 
+2

vous pouvez combiner les 4 graphiques en un graphique en utilisant soit matplot (données [1], données [2,5], type = "b") ou avec les commandes individuelles de traçage précédées de mise en page (matrice (c (1,2 , 3,4), 2,2, byrow = VRAI)) – bubaker

5

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 peut utiliser les paquets du Prof. Hadley Wickham ggplot2 & 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), axe régler, ensemble Options individuelles pour chaque ligne, etc.

Lien vers online documentation.

7

Dans votre exemple,

plot(scale, serial) 

ne fonctionnera pas parce que scale et serial sont les deux trames de données, par exemple

class(scale) 
[1] "data.frame" 

Vous pouvez essayer ce qui suit et utiliser points(), une fois que la parcelle a été généré, pour tracer les colonnes restantes. Remarque, j'ai utilisé le paramètre ylim dans plot pour prendre en compte 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') 
+1

Merci! Cela a finalement résolu mon problème. –

0

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 verbeux (-v) pour voir le script R correspondant.

0
data <- read.table(...) 
plot(data$scale,data$serial)