在一个图中绘制多个密度图的外包络

时间:2015-07-19 02:43:52

标签: r

我想绘制包含多个密度图并提取其值的分布图的外部外包络(轮廓)。

X <- c(1,2,1,4,3,1,2,8,9,0,5,4,2,2,5,5,7,8,8,9,5,6,5,6,3,4,5,3,4,5,4)
Y <- c(0,3,1,1,3,2,7,1,2,1,9,2,1,3,6,1,9,5,2,9,1,1,2,1,3,4,6,9,4,5,2)
Z <- c(1,4,9,5,7,8,2,8,9,0,5,4,2,2,5,5,7,8,8,9,5,6,5,6,9,9,9,2,6,7,1)
W <- c(1,8,9,7,8,9,12,3,11,21,5,4,8,8,2,3,2,1,2,3,4,5,6,3,1,9,2,1,8,4,1)
Q <- c(1,8,9,7,8,9,12,3,16,30,2,3,4,4,4,3,7,7,2,3,2,5,9,3,2,1,1,1,1,1,0)

n <- data.frame(X,Y,Z,W,Q)

plot((density(X)))
fun <- function(x)lines((density(n[[x]])))
t <- seq(1:length(n))
lapply(t,fun)

在网上搜索过,我可以找到轮廓但不能应用于上面生成的分布图。

2 个答案:

答案 0 :(得分:4)

我怀疑你在问什么可能被称为“外壳”。你可以看到我的第一个努力有几个问题:

lines(  x= density(X)$x, 
        y=apply(  do.call( cbind, 
                  lapply(n, function(x){ density(x)$y})), 1, max), col="red", lwd=3)

我认为这也突出了你的努力中的问题,因为它说明了没有建立一个挂起你的密度估计的公共网格的问题。

enter image description here

所以建立限制并重新做:

from=min(X,Y,Z,W,Q); to = max(X,Y,Z,W,Q)
png()
 plot( Xd <- density(X, from=from, to=to))
 fun <- function(x) lines(density(n[[x]],from=from, to = to  ) )
 t <- seq(1:length(n))
 lapply(t,fun)
 lines(  x= density(X, from=from, to=to )$x, 
         y=apply(  do.call( cbind, lapply(n, 
                     function(x){ density(x, from=from, to = to)$y})), 1, max), col="red", lwd=3)
    dev.off()

enter image description here

答案 1 :(得分:1)

这是一个非常类似于BondedDust的答案(并且基于他的from / to方法),我认为如果数据集非常大,我认为它更容易阅读并且可能更快,因为它不会计算两次密度。

from <- min(n)
to <- max(n)

t <- seq(1:length(n))
ds <- lapply(t, function(i) density(n[[i]], from=from, to=to)) #Densities
maxd <- apply(sapply(ds, "[[", "y"), 1, max) #Max y of each x

plot(density(X), type="n", ylim=c(0, max(maxd)), xlim=c(0, 15))
for (i in t) lines(ds[[i]])
lines(seq(from, to, length.out = length(maxd)), maxd, col="red", lwd=3)

我手动设置绘图xlim以获得更好的可视化效果。

enter image description here