несколько гистограмм в верхней части друг друга без бинов - PullRequest
7 голосов
/ 17 мая 2011

Допустим, у меня есть этот фрейм данных с 2 уровнями.LC и HC.Теперь я хочу получить 2 сюжета, как показано ниже, поверх друг друга.

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

Код для получения следующего сюжета =

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

(благодаря Джорис Мейс)

Итак, как мне начать с этого?Так как я привык к Java, я думал о цикле for, но мне сказали не делать этого так.

enter image description here

Ответы [ 2 ]

13 голосов
/ 17 мая 2011

Рядом с методом, предоставленным Аароном, есть решение ggplot (см. Ниже), но я бы настоятельно советовал вам использовать плотности, так как они дадут более приятные графики и их гораздо проще построить:

# 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)

дает: enter image description here

Для участка, который вы запросили:

# 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

4 голосов
/ 17 мая 2011

Вы можете использовать тот же код за исключением точек вместо графика для добавления дополнительных линий к графику.

Составление некоторых данных

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

И делать это довольно простым способом:

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")

Или, если говорить более подробно:

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])
}

РЕДАКТИРОВАТЬ: Вдохновленный ответом Джориса, я отмечу, что решетка также может легко создавать перекрывающиеся графики плотности.1012 *

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