0

我有一个人口的时间序列直方图,我想在一个图中表示。我试图避免将所有直方图放在一个 x,y 图中,这会变得非常混乱。相反,我想制作一个图,绘制一系列只有 x 轴的直方图(对于我的数据,形状和 x 值很重要),每个直方图垂直堆叠在另一个之上。换句话说,我可以制作一堆单独的直方图,将它们导出到 Illustrator,然后将它们放在一个垂直的行中,并将垂直的“z 轴”标记为时间,但似乎应该能够在 R 中做到这一点

4

1 回答 1

3

在函数hist中,可以设置freq=FALSE为以绘制密度而不是频率。这将以将注意力集中在形状而不是幅度上的方式缩放直方图的 y 轴。但是,即使使用默认频率直方图,您的绘图也会具有相同的形状。

这是一个示例图,其中您的设备分为 4 行和 1 列。每个直方图都有不同的分布,但所有图都对直方图使用相同的分箱(即breaks参数):

示例 1:

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)

以下内容可能更符合您的兴趣 - 每个连续直方图都可能是一个 time t。通过稍微减少边距,您可以跟踪形状随时间的进展:

示例 2:

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)

在此处输入图像描述

于 2013-01-26T08:05:53.057 回答