2009-09-02 16 views
6

Tengo datos que se parecen a this.Cómo superponer curvas de densidad múltiple en un trazado en R

Y tengo la intención de crear una curva de densidad múltiple en una parcela, donde cada curva corresponde a la ID única.

Intenté usar el paquete "sm", con este código, pero sin éxito.

library(sm) 
dat <- read.table("mydat.txt"); 
plotfn <- ("~/Desktop/flowgram_superimposed.pdf"); 
pdf(plotfn); 

sm.density.compare(dat$V1,dat$V2, xlab = "Flow Signal") 
colfill <- c(2:10); 
legend(locator(1), levels(dat$V2), fill=colfill) 

dev.off(); 

Por favor, consejos cuál es la forma correcta de hacerlo o si hay forma alternativa de hacerlo?

Estoy tratando de obtener este tipo de trama al final. figure http://img524.imageshack.us/img524/2736/testl.png

+2

Preguntando aquí _y_ en la lista R al mismo tiempo: No es genial. http://www.nabble.com/Howto-Superimpose-Multiple-Density-Curves-Into-One-Plot-td25254899.html –

+0

No estoy seguro de entender por qué, teniendo en cuenta que aún no hay una gran cantidad de superposición entre los dos grupos de usuarios. ¿Puedes explicar por qué no se debe hacer eso? –

+1

"La publicación múltiple es una pérdida de ancho de banda, dinero y tiempo de las personas, sin ventajas, y nunca debe permitirse". http://bit.ly/Ja5n1. Aunque las dos primeras razones son menos importantes actualmente, valoro mi tiempo y no me gusta leer el mismo mensaje en varias listas. –

Respuesta

11

Trate de usar ggplot2:

dnow <- read.table("http://dpaste.com/88561/plain/") 
library(ggplot2) 
qplot(V1, colour=factor(V2), data=dnow, geom="density") 
+0

¡Buena solución que muestra el poder de ggplot2! –

+1

el enlace ya no funciona. De esta forma no puedo entender bien lo que hace tu solución. ¿Podrías arreglar el enlace? Gracias ... –

+3

@Manoel 'qplot (mtcars $ drat, color = factor (mtcars $ cyl), data = mtcars, geom =" densidad ")' debería darle un ejemplo funcional. – Unode

3

Uso de gráficos de base en un código de espagueti de la manera:

plot.multi.dens <- function(s) 
{ 
junk.x = NULL 
junk.y = NULL 
for(i in 1:length(s)) 
{ 
junk.x = c(junk.x, density(s[[i]])$x) 
junk.y = c(junk.y, density(s[[i]])$y) 
} 
xr <- range(junk.x) 
yr <- range(junk.y) 
plot(density(s[[1]]), xlim = xr, ylim = yr, main = "") 
for(i in 1:length(s)) 
{ 
lines(density(s[[i]]), xlim = xr, ylim = yr, col = i) 
} 
} 
dnow <- read.table("http://dpaste.com/88561/plain/") 
library(sqldf) 
x <- unlist(sqldf("select V1 from dnow where V2==0")) 
y <- unlist(sqldf("select V1 from dnow where V2==1")) 
z <- unlist(sqldf("select V1 from dnow where V2==2")) 
plot.multi.dens(list(x,y,z)) 
library(Hmisc) 
le <- largest.empty(x,y,.1,.1) 
legend(le,legend=c("x","y","z"), col=(1:3), lwd=2, lty = 1) 
+3

¿Cuál es el propósito de usar sqldf aquí? Es literalmente cien veces más lento que la subscripción: x <- con (dnow, V1 [V2 == 0]) –

+0

Tienes razón. Pero me gusta el paquete sqldf y su enfoque, así que tiendo a usarlo sin cerebro ;-) – Paolo

1

me vi obligado a hacer esto mucho cuando se mira en los microarrays de datos, por lo que Lo saqué como parte de una biblioteca de código de utilidad que guardo en github: ARE.utils, específicamente la función plot.densities.

Se utiliza gráficos de base para que pueda tomar la inspiración de esa función para crear su propio, o que acaba de tomar toda la venta (pero depende de algunas otras funciones en esa biblioteca):

  1. create.densities, que convierte una lista/matriz/etc. de datos en una lista de densidades; y
  2. match.dim función (que convierte los "nombres" de dimensión en ejes numéricos).

(Usted puede, opcionalmente, instalar todo el paquete, pero no prometo que las funciones allí no cambiarán de una manera incompatible).

No es difícil escribir su propia función, pero solo asegúrese de tener la función de elegir el rango correcto en los ejes y esas cosas. De todos modos, usted entonces utilizar el código como el siguiente:

library(ARE.utils) 
# Create a matrix dataset with separate observations in columns 
dat <- matrix(c(rnorm(100), rnorm(100, mean=3), 
       rnorm(100, mean=3, sd=2)), 
       ncol=3) 
# Plot them 
plot.densities(dat, along='cols') 

que crearía tres gráficos de densidad diferentes en el mismo eje con sus propios colores.

+0

Steve, si esto contiene información útil y pasa la verificación R CMD, por supuesto, envíelo a CRAN. Si no pasa R CMD, verifique aún, trabaje en esa parte y luego regrese al paso anterior :) –

+0

Dirk, ¿está insinuando que la compatibilidad con versiones anteriores no debería ser una gran preocupación? –

+0

Eduardo: ¿Qué tiene que ver la compatibilidad con versiones anteriores con esto? No dude en enviarme un correo electrónico fuera de SO. Realmente no entiendo tu pregunta. –

4

También puede resolver esto usando el paquete de celosía.

require(lattice) 
dnow <- read.table('http://dpaste.com/88561/plain/') 
densityplot(~V1, groups=V2, data=dnow) 
Cuestiones relacionadas