2009-05-18 17 views
18

Tengo un archivo separado por comas llamado foo.csv que contiene los siguientes datos:Para representar datos simples en 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 

que esencialmente dos preguntas:

1) ¿Cómo representar gráficamente la primera columna (x- eje) versus la segunda columna (eje y)? Estoy tratando esto (de la lectura de this site):

data <- read.table("foo.csv", header=T,sep=",") 
attach(data) 
scale <- data[1] 
serial <- data[2] 
plot(scale,serial) 

pero me sale este error de vuelta:

Error in stripchart.default(x1, ...) : invalid plotting method 

Alguna idea de lo que estoy haciendo mal? A quick Google search revela a otra persona con el mismo problema pero sin respuesta relevante. ACTUALIZACIÓN: resulta que funciona bien si omito las dos instrucciones de asignación en el medio. ¿Alguna idea de por qué es esto?

La segunda pregunta sigue con bastante facilidad después de la primera:

2) ¿Cómo representar gráficamente la primera columna (eje x) frente a todas las otras columnas en el eje y? Supongo que es bastante fácil una vez que soluciono el primer problema con el que me estoy encontrando, pero soy un poco nuevo para R, así que todavía me estoy volviendo loco.

Respuesta

11

Usted no necesita las dos líneas:

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

como escala y de serie ya se establecen desde las cabeceras en el read.table.

también scale <- data[1] crea un elemento de una data.frame

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

mientras que scale del read.table es un vector

5 10 12 15 

y la función plot(scale, serial) espera vectorial en lugar de un hoja.de.datos, por lo que sólo necesita hacer

plot(scale, serial) 

Un enfoque para el trazado de las otras columnas de datos sobre el eje 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") 

probablemente hay mejores maneras de hacer esto, pero eso es más allá de mi conocimiento actual R ....

+0

Entonces, ¿cómo debería ser su llamada a plot()? –

+0

solo usa el diagrama (escala, serial) – luapyad

+0

Desafortunadamente, "scale" parece ser un global de algún tipo. –

2

estoy lejos de ser un experto R, pero creo que es necesario un hoja.de.datos:

plot(data.frame(data[1],data[2])) 

Lo hace al menos trama algo en la configuración R!

Siguiendo el consejo en la respuesta de luapyad, se me ocurrió esto. Me cambió el nombre de la cabecera "escala":

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 

a continuación:

foo <- read.table("foo.csv", header=T,sep=",") 
attach(foo) 
plot(scaling, serial); 
2

Prueba esto:

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

puede combinar los 4 gráficos en un gráfico usando matplot (datos [1], datos [2,5], tipo = "b") o con los comandos de trazado individuales precedidos por el diseño (matriz (c , 3,4), 2,2, byrow = TRUE)) – bubaker

5

Soy nuevo en R, pero si desea dibujar escala frente a todas las demás columnas en una trama, fácil y con un poco de elegancia :) para la impresión o presentación, puede usar los paquetes del Prof. Hadley Wickham ggplot2 & remodelar.

Instalación:

install.packages(“ggplot2”,dep=T) 
install.packages(“reshape”,dep=T) 

Dibujo tu ejemplo:

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) 

También es posible usar puntos (geom=”points”), elegir diferentes colores o formas para diferentes puntos variables (colours=variable or shape=variable), ajuste del eje, ajuste opciones individuales para cada línea, etc.

Enlace a online documentation.

7

En su ejemplo,

plot(scale, serial) 

no funcionará porque scale y serial son ambas tramas de datos, por ejemplo,

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

puede probar con el siguiente y use points(), una vez que la parcela se ha generado, para trazar las columnas restantes. Tenga en cuenta que utilicé el parámetro ylim en plot para acomodar el rango en la tercera columna.

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

¡Gracias! Eso finalmente resolvió mi problema. –

0

Hay una manera sencilla-r de planear que:

https://code.google.com/p/simple-r/

Usando ese guión, sólo hay que escribir:

r -cdps, -k1:2 foo.csv 

Para obtener la gráfica que desea . Ponlo en el modo detallado (-v) para ver el script R correspondiente.

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