如何在R中叠加密度图?

时间:2011-08-04 09:37:26

标签: r plot density-plot

我想用R覆盖同一设备上的2个密度图。我该怎么做?我在网上搜索但我没有找到任何明显的解决方案(我对R来说很新)。

我的想法是从文本文件(列)中读取数据,然后使用

plot(density(MyData$Column1))
plot(density(MyData$Column2), add=T)

这种精神很好......

提前致谢

8 个答案:

答案 0 :(得分:80)

使用lines作为第二个:

plot(density(MyData$Column1))
lines(density(MyData$Column2))

确保第一个图的限制是合适的。

答案 1 :(得分:43)

ggplot2是另一个图形软件包,可以处理像Gavin以漂亮方式提到的范围问题。它还处理自动生成适当的传说,并且通常在我看来开箱即用,手动操作更少。

library(ggplot2)

#Sample data
dat <- data.frame(dens = c(rnorm(100), rnorm(100, 10, 5))
                   , lines = rep(c("a", "b"), each = 100))
#Plot.
ggplot(dat, aes(x = dens, fill = lines)) + geom_density(alpha = 0.5)

enter image description here

答案 2 :(得分:12)

只是提供一套完整的设置,这是使用lattice的Chase答案版本:

dat <- data.frame(dens = c(rnorm(100), rnorm(100, 10, 5))
                   , lines = rep(c("a", "b"), each = 100))

densityplot(~dens,data=dat,groups = lines,
            plot.points = FALSE, ref = TRUE, 
            auto.key = list(space = "right"))

产生如下情节: enter image description here

答案 3 :(得分:12)

添加负责y轴限制的基本图形版本,添加颜色并适用于任意数量的列:

如果我们有数据集:

myData <- data.frame(std.nromal=rnorm(1000, m=0, sd=1),
                     wide.normal=rnorm(1000, m=0, sd=2),
                     exponent=rexp(1000, rate=1),
                     uniform=runif(1000, min=-3, max=3)
                     )

然后绘制密度:

dens <- apply(myData, 2, density)

plot(NA, xlim=range(sapply(dens, "[", "x")), ylim=range(sapply(dens, "[", "y")))
mapply(lines, dens, col=1:length(dens))

legend("topright", legend=names(dens), fill=1:length(dens))

给出了:

enter image description here

答案 4 :(得分:3)

我采用了上面的格子示例并且做了一个漂亮的功能。通过熔化/铸造重塑可能有更好的方法。 (如果您看到改进,请进行评论或编辑。)

multi.density.plot=function(data,main=paste(names(data),collapse = ' vs '),...){
  ##combines multiple density plots together when given a list
  df=data.frame();
  for(n in names(data)){
    idf=data.frame(x=data[[n]],label=rep(n,length(data[[n]])))
    df=rbind(df,idf)
  }
  densityplot(~x,data=df,groups = label,plot.points = F, ref = T, auto.key = list(space = "right"),main=main,...)
}

使用示例:

multi.density.plot(list(BN1=bn1$V1,BN2=bn2$V1),main='BN1 vs BN2')

multi.density.plot(list(BN1=bn1$V1,BN2=bn2$V1))

答案 5 :(得分:3)

我就是这样做的基础(它在第一个回答评论中实际提到了,但我会在这里显示完整的代码,包括传说,因为我还无法发表评论......)

首先,您需要从密度图中获取y轴最大值的信息。所以你需要先分别计算密度

dta_A <- density(VarA, na.rm = TRUE)
dta_B <- density(VarB, na.rm = TRUE)

然后根据第一个答案绘制它们,并定义您刚刚获得的y轴的最小值和最大值。 (我将最小值设置为0)

plot(dta_A, col = "blue", main = "2 densities on one plot"), 
     ylim = c(0, max(dta_A$y,dta_B$y)))  
lines(dta_B, col = "red")

然后在右上角添加一个图例

legend("topright", c("VarA","VarB"), lty = c(1,1), col = c("blue","red"))

答案 6 :(得分:2)

每当出现轴限制不匹配的问题时,base图形中的正确工具就是使用matplot。关键是利用from的{​​{1}}和to参数。这有点hackish,但推动自己相当直接:

density.default

enter image description here

根据需要添加铃声和口哨(set.seed(102349) x1 = rnorm(1000, mean = 5, sd = 3) x2 = rnorm(5000, mean = 2, sd = 8) xrng = range(x1, x2) #force the x values at which density is # evaluated to be the same between 'density' # calls by specifying 'from' and 'to' # (and possibly 'n', if you'd like) kde1 = density(x1, from = xrng[1L], to = xrng[2L]) kde2 = density(x2, from = xrng[1L], to = xrng[2L]) matplot(kde1$x, cbind(kde1$y, kde2$y)) 接受所有标准matplot / plot参数,例如parltytypecol,...)。

答案 7 :(得分:2)

您可以使用ggjoy软件包。假设我们有三种不同的beta分布,例如:

set.seed(5)
b1<-data.frame(Variant= "Variant 1", Values = rbeta(1000, 101, 1001))
b2<-data.frame(Variant= "Variant 2", Values = rbeta(1000, 111, 1011))
b3<-data.frame(Variant= "Variant 3", Values = rbeta(1000, 11, 101))


df<-rbind(b1,b2,b3)

您可以得到三种不同的分布,如下所示:

library(tidyverse)
library(ggjoy)


ggplot(df, aes(x=Values, y=Variant))+
    geom_joy(scale = 2, alpha=0.5) +
    scale_y_discrete(expand=c(0.01, 0)) +
    scale_x_continuous(expand=c(0.01, 0)) +
    theme_joy()

enter image description here