Перекрывающиеся сложенные графики плотности

Я пытаюсь создать сюжет, аналогичный этому, используя собственную команду сюжета 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)
}

Выходы:

введите здесь описание изображения


person Omar Wagih    schedule 15.08.2014    source источник
comment
Вы не можете сделать это с par(mfrow=...). Нужно увеличить смещение x полигона.   -  person IRTFM    schedule 15.08.2014


Ответы (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)
}

Вывод

person Anders Ellern Bilgrau    schedule 15.08.2014
comment
Работает как шарм! Благодарю вас! - person Omar Wagih; 15.08.2014
comment
@by0 Нет проблем, я рад, что смог помочь. Возможно, вы захотите поиграть с графиком ylim и значением fac, чтобы получить правильный результат. Также обратите внимание, что он строится снизу вверх. - person Anders Ellern Bilgrau; 15.08.2014
comment
Я изменил его, чтобы он отображался сверху вниз, и поместил его в функцию (см. обновленный вопрос). Спасибо еще раз! - person Omar Wagih; 15.08.2014

(Примечание. Этот контент был ранее отредактирован в вопросе и был написан @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)

выходы:

введите здесь описание изображения

person Community    schedule 12.06.2017