superponer - Trazar datos simples en R
superponer graficas en r (7)
Tengo un archivo separado por comas llamado foo.csv
contiene los siguientes datos:
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
Esencialmente tengo dos preguntas:
1) ¿Cómo trazo la primera columna (eje x) versus la segunda columna (eje y)? Estoy intentando esto (leyendo este sitio ):
data <- read.table("foo.csv", header=T,sep=",")
attach(data)
scale <- data[1]
serial <- data[2]
plot(scale,serial)
Pero recupero este error:
Error in stripchart.default(x1, ...) : invalid plotting method
¿Alguna idea de lo que estoy haciendo mal? Una búsqueda rápida en Google 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 es bastante fácil después de la primera:
2) ¿Cómo grafico la primera columna (eje x) versus 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.
Estoy lejos de ser un experto en R, pero creo que necesitas un data.frame:
plot(data.frame(data[1],data[2]))
¡Al menos trama algo en mi configuración R!
Siguiendo los consejos de la respuesta de luapyad, se me ocurrió esto. Cambié el nombre del encabezado "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
entonces:
foo <- read.table("foo.csv", header=T,sep=",")
attach(foo)
plot( scaling, serial );
No necesitas las dos líneas:
scale <- data[1]
serial <- data[2]
como escala y serie ya están configurados desde los encabezados en la read.table
.
También scale <- data[1]
crea un elemento a partir de un data.frame
data[1]
1 5
2 10
3 12
4 15
mientras que la scale
de read.table
es un vector
5 10 12 15
y la función de plot(scale, serial)
espera un vector en lugar de un marco de datos, por lo que solo tiene que hacer
plot(scale, serial)
Un enfoque para trazar las otras columnas de datos en 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 haya mejores formas de hacerlo, pero eso está más allá de mi conocimiento actual de R ...
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)
Soy nuevo en R, pero si desea dibujar una escala frente a todas las otras columnas en una parcela, fácil y con un poco de elegancia :) para imprimir o presentar, puede utilizar los paquetes del profesor Hadley Wickham ggplot2 y remodelar.
Instalación:
install.packages(“ggplot2”,dep=T)
install.packages(“reshape”,dep=T)
Dibujando 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 podría usar puntos ( geom=”points”
), elegir diferentes colores o formas para diferentes variables puntos ( colours=variable or shape=variable
), ajustar el eje, establecer opciones individuales para cada línea, etc.
Enlace a la documentación en línea .
En tu ejemplo,
plot(scale, serial)
no funcionará porque la scale
y la serial
son ambos marcos de datos, por ejemplo
class(scale)
[1] "data.frame"
Puede intentar lo siguiente y usar points()
, una vez que se ha generado la trama, para trazar las columnas restantes. Tenga en cuenta que utilicé el parámetro ylim
en el 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'')
Hay una forma simple-r de trazarlo:
https://code.google.com/p/simple-r/
Usando ese script, solo tienes que escribir:
r -cdps, -k1:2 foo.csv
Para obtener la trama que quieres. Ponlo en el modo detallado (-v) para ver el script R correspondiente.
data <- read.table(...)
plot(data$scale,data$serial)