我有一个人口的直方图的时间序列,我想在一个图中表示。我试图避免将所有直方图放在一个x,y图中,这样会变得非常混乱。相反,我想制作一个图形,绘制一系列只有x轴的直方图(对于我的数据,形状和x值都很重要),每个直方图垂直堆叠在另一个上面。换句话说,我可以制作一堆单独的直方图,将它们导出到Illustrator,然后将它们一个放在另一个垂直行的顶部,并将垂直“z轴”标记为时间,但似乎应该是能够在R
中做到这一点答案 0 :(得分:3)
在函数hist
中,可以将freq=FALSE
设置为以绘制密度而不是频率。这将缩放直方图的y轴,使注意力集中在形状而不是幅度上。但是,即使使用默认频率直方图,您的图形也会具有相同的形状。
以下是一个示例图,其中您的设备分为4行1列。每个直方图具有不同的分布,但所有绘图对直方图使用相同的分箱(即breaks
参数):
set.seed(1)
f1 <- rnorm(100, mean=0, sd=1)
f2 <- rnorm(100, mean=3, sd=3)
f3 <- rnorm(100, mean=4, sd=1)
f4 <- rnorm(100, mean=7, sd=3)
breaks <- pretty(c(f1, f2, f3, f4), n=20)
x11(width=4, height=8)
op <- par(mfcol=c(4,1))
hist(f1, freq=FALSE, breaks=breaks)
hist(f2, freq=FALSE, breaks=breaks)
hist(f3, freq=FALSE, breaks=breaks)
hist(f4, freq=FALSE, breaks=breaks)
par(op)
可能更符合您感兴趣的内容,如下所示 - 每个连续直方图可能是时间t
。通过稍微减少边距,您可以跟踪形状随时间的变化:
set.seed(1)
N <- 100
M <- 7
MEAN <- c(1:M)
SD <- MEAN*0.2+1
RES <- list()
for(i in seq(M)){
RES[[i]] <- rnorm(N, mean=MEAN[[i]], sd=SD[[i]])
}
breaks <- pretty(unlist(RES), n=20)
x11(width=4, height=10)
op <- par(mfcol=c(M,1), mar=c(1,3,0,0), oma=c(3,2,1,1))
for(i in seq(M)){
h1 <- hist(RES[[i]], breaks=breaks, plot=FALSE)
plot(h1$mids, h1$densit, t="n", xlab="", ylab="", xaxt="n")
grid()
lines(h1$mids, h1$densit, t="S")
text(par()$usr[1], par()$usr[3]+(par()$usr[4]-par()$usr[3])*0.9, labels=paste("t", i), pos=4)
if(i == M){
axis(1)
} else {
axis(1, labels=FALSE)
}
}
mtext("Density", outer=TRUE, side=2, line=0)
par(op)