重叠堆积密度图

Posted

技术标签:

【中文标题】重叠堆积密度图【英文标题】:Overlapping stacked density plots 【发布时间】:2014-10-09 07:32:06 【问题描述】:

我正在尝试使用 R 的本机绘图命令来实现与此类似的绘图。

我能够通过下面的代码得到类似的东西,但是,我希望密度多边形重叠。谁能建议一种方法来做到这一点?

data = lapply(1:5, function(x) density(rnorm(100, mean = x)))

par(mfrow=c(5,1))
for(i in 1:length(data))
  plot(data[[i]], xaxt='n', yaxt='n', main='', xlim=c(-2, 8), xlab='', ylab='', bty='n', lwd=1)
  polygon(data[[i]], col=rgb(0,0,0,.4), border=NA)
  abline(h=0, lwd=0.5)

输出:

【问题讨论】:

您无法使用par(mfrow=...) 执行此操作。需要增加多边形的 x 偏移量。 【参考方案1】:

(注:此内容之前编辑成问题,由@by0撰写。)

感谢@AEBilgrau,我很快将这个功能组合在一起,效果非常好。注意:您需要根据您的数据使用因子fac

stacked.density <- function(data, fac = 3, xlim, col = 'black', 
                            alpha = 0.4, show.xaxis = T, 
                            xlab = '', ylab = '')
  xvals = unlist(lapply(data, function(d) d$x))
  if(missing(xlim)) xlim=c(min(xvals), max(xvals))

  col = sapply(col, col2alpha, alpha)
  if(length(col) == 1) col = rep(col, length(data))

  plot(1, type = "n", xlim = xlim, ylim = c(1,length(data) + 2),
       yaxt='n', bty='n', xaxt=ifelse(show.xaxis, 'l', 'n'), xlab = xlab, ylab = ylab)

  z = length(data):1
  for(i in 1:length(data))
    d = data[[ z[i] ]]
    lines(d$x, fac*d$y + i, lwd=1)
    polygon(d$x, fac*d$y+ i, col=col[i], border=NA)
    abline(h = i, lwd=0.5)
  


data <- lapply(1:5, function(x) density(rnorm(100, mean = x)))
stacked.density(data, col=c('red', 'purple', 'blue', 'green', 'yellow'), alpha=0.3, show.xaxis=T)

输出:

【讨论】:

【参考方案2】:

我会做如下的事情。我在同一个图中绘制了密度,但在 y 值上添加了一个整数。为了使它们重叠,我乘以一个常数因子fac

# Create your toy data
data <- lapply(1:5, function(x) density(rnorm(100, mean = x)))

fac <- 5  # A factor to make the densities overlap

# We make a empty plot
plot(1, type = "n", xlim = c(-3, 10), ylim = c(1, length(data) + 2),
     axes = FALSE, xlab = "", ylab = "")  

# Add each density, shifted by i and scaled by fac
for(i in 1:length(data))
  lines(  data[[i]]$x, fac*data[[i]]$y + i)
  polygon(data[[i]]$x, fac*data[[i]]$y + i, col = rgb(0, 0, 0, 0.4), border = NA)
  abline(h = i, lwd = 0.5)

【讨论】:

像魅力一样工作!谢谢! @by0 没问题,我很高兴能帮上忙。您可能想玩弄 ylim 的情节和 fac 的值来获得恰到好处的输出。另请注意,它是自下而上绘制的。 我对其进行了更改,使其从上到下绘制并将其放入函数中(请参阅更新的问题)。再次感谢!

以上是关于重叠堆积密度图的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化2d密度图:可视化二维密度图并将两个二维密度图重叠起来Overlay two ggplot2 stat_density2d plots

使用R通过ggplot计算重叠密度图的面积

R可视化ggplot2绘制重叠密度图(Overlay Density Plots)

在 R 中覆盖 10 个密度图,颜色与重叠图的数量成正比

R-散点密度图

在ggplot2中强制密度图的颜色