2011-05-17 20 views
7

Digamos que tengo este datagrama con 2 niveles. LC y HC. Ahora quiero obtener 2 tramas como las de abajo una sobre la otra.múltiples histogramas uno encima del otro sin contenedores

data <- data.frame(
    welltype=c("LC","LC","LC","LC","LC","HC","HC","HC","HC","HC"), 
    value=c(1,2,1,2,1,5,4,5,4,5)) 

el código para obtener siguiente diagrama =

x <- rnorm(1000) 
y <- hist(x) 
plot(y$breaks, 
    c(y$counts,0), 
    type="s",col="blue") 

(con gracias a Joris Meys)

Así que, ¿cómo puedo siquiera empezar en esto. Como estoy acostumbrado a Java, estaba pensando en un bucle for, pero me han dicho que no lo haga de esta manera.

enter image description here

Respuesta

4

Usted puede utilizar el mismo código, excepto con puntos en lugar de parcela para añadir líneas adicionales a la trama.

Preparacion algunos datos

set.seed(5) 
d <- data.frame(x=c(rnorm(1000)+3, rnorm(1000)), 
       g=rep(1:2, each=1000)) 

y hacerlo de una manera bastante sencilla:

x1 <- d$x[d$g==1] 
x2 <- d$x[d$g==2] 
y1 <- hist(x1, plot=FALSE) 
y2 <- hist(x2, plot=FALSE) 
plot(y1$breaks, c(y1$counts,0), type="s",col="blue", 
    xlim=range(c(y1$breaks, y2$breaks)), ylim=range(c(0,y1$counts, y2$counts))) 
points(y2$breaks, c(y2$counts,0), type="s", col="red") 

O en un R-ish manera más:

col <- c("blue", "red") 
ds <- split(d$x, d$g) 
hs <- lapply(ds, hist, plot=FALSE) 
plot(0,0,type="n", 
    ylim=range(c(0,unlist(lapply(hs, function(x) x$counts)))), 
    xlim=range(unlist(lapply(hs, function(x) x$breaks)))) 
for(i in seq_along(hs)) { 
    points(hs[[i]]$breaks, c(hs[[i]]$counts,0), type="s", col=col[i]) 
} 

EDIT: Inspired por la respuesta de Joris, notaré que el enrejado también puede hacer fácilmente diagramas de densidad superpuestos.

library(lattice) 
densityplot(~x, group=g, data=d) 
13

Junto al método proporcionado por Aaron, hay una solución ggplot también (véase más adelante), pero yo les recomiendo vivamente a utilizar las densidades, ya que darán parcelas más agradables y son mucho más fácil para construir:

# make data 
wells <- c("LC","HC","BC") 
Data <- data.frame(
    welltype=rep(wells,each=100), 
    value=c(rnorm(100),rnorm(100,2),rnorm(100,3)) 
) 

ggplot(Data,aes(value,fill=welltype)) + geom_density(alpha=0.2) 

da: enter image description here

para la trama solicitada:

# make hists dataframe 
hists <- tapply(Data$value,Data$welltype, 
      function(i){ 
       tmp <- hist(i) 
       data.frame(br=tmp$breaks,co=c(tmp$counts,0)) 
      }) 
ll <- sapply(hists,nrow) 
hists <- do.call(rbind,hists) 
hists$fac <- rep(wells,ll) 

# make plot 
require(ggplot2) 
qplot(br,co,data=hists,geom="step",colour=fac) 

enter image description here

+0

Ooh, esos son agradables. Tengo que aprender ggplot. – Aaron

Cuestiones relacionadas