如何在R中叠加密度图?

pas*_*sta 74 plot r density-plot

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

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

plot(density(MyData$Column1))
plot(density(MyData$Column2), add=T)
Run Code Online (Sandbox Code Playgroud)

这种精神......

提前致谢

cbe*_*ica 83

使用lines了第二个:

plot(density(MyData$Column1))
lines(density(MyData$Column2))
Run Code Online (Sandbox Code Playgroud)

但要确保第一个图的限制是合适的.

  • +1当两个密度具有不同的范围且第二个曲线不符合绘图限制时,您可能需要稍微复杂一些的东西.然后你可以在绘图之前计算密度,并使用`range(dens1 $ y,dens2 $ y)计算适当的'ylim`,其中`dens1`和`dens2`是包含两个密度估计对象的对象.在`plot()`的调用中使用这个`ylim`. (6认同)
  • 您可能还想区分这两行.设置线宽(`lwd`),线型(`lty`)或线条颜色(`col`)应该有帮助.此时,您还可以考虑使用`legend()`添加图例 (2认同)

Cha*_*ase 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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • OP的data.frame需要首先熔化为长形:`ggplot(melt(MyData),mapping = aes(fill = variable,x = value))+ geom_density(alpha = .5)` (7认同)

Kar*_*ius 17

添加处理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)
                     )
Run Code Online (Sandbox Code Playgroud)

然后绘制密度:

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))
Run Code Online (Sandbox Code Playgroud)

这使:

在此输入图像描述


jor*_*ran 12

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

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"))
Run Code Online (Sandbox Code Playgroud)

产生这样的情节: 在此输入图像描述


R. *_*ost 7

这就是我在 base 中的做法(实际上在第一个答案评论中提到过,但我将在此处显示完整代码,包括图例,因为我还不能评论......)

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

dta_A <- density(VarA, na.rm = TRUE)
dta_B <- density(VarB, na.rm = TRUE)
Run Code Online (Sandbox Code Playgroud)

然后根据第一个答案绘制它们并为您刚刚获得的 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")
Run Code Online (Sandbox Code Playgroud)

然后在右上角添加图例

legend("topright", c("VarA","VarB"), lty = c(1,1), col = c("blue","red"))
Run Code Online (Sandbox Code Playgroud)