2015-05-04 3 views
1

Я пытаюсь создать сюжет, который затеняет область под кривой графика плотности между двумя точками. Вот то, что я до сих пор:Затенение (граненый) плотности между двумя точками ggplot2

df.ind <- data.frame(x=rnorm(1000)) 
df.group <- data.frame(group = factor(1:20)) 
df.group$gr.mean <- rnorm(20) 
df.group$width <- 1 + abs(rnorm(20)) 
df.group$upper <- df.group$gr.mean + df.group$width 
df.group$lower <- df.group$gr.mean - df.group$width 

Затем я могу создать ggplot, где я использую плотность x от df.ind и построить ее 20 различных раз (от каждой группы). Затем я накладываю вертикальные линии. То, что я хочу сделать, - это оттенок области между линиями.

ggplot(df.group) + 
    stat_density(data=df.ind, mapping=aes(x), 
       geom="line", position="dodge") + 
    facet_wrap(~group) + 
    geom_vline(aes(xintercept=lower)) + 
    geom_vline(aes(xintercept=upper)) 

Я знаю подобный вопрос здесь: ggplot2 shade area under density curve by group и здесь: Shading a kernel density plot between two points.

Но мои данные поступают из двух различных data.frame объектов. Поэтому я не могу использовать умный трюк, который они используют для агрегирования данных ...

+0

Ну, объединить свои кадры данных и использовать ранее предложенные методы. – MrFlick

+0

@MrFlick - нечего смириться. Они не имеют общих характеристик. – Alex

+2

Ну, тогда вам нужно будет повторить отдельные данные для каждой группы. Или вы можете предварительно вычислить кривую плотности один раз и повторить эти данные для каждой группы. ggplot не собирается делать каких-либо специальных обнаружений перекрытия многоугольников. вам нужно рассчитать данные, которые вы хотите построить. – MrFlick

ответ

3

Как я уже упоминал в комментариях, вам придется делать работу по созданию данных специально для каждой панели самостоятельно. Вот один из способов

# calculate density 
dx<-density(df.ind$x) 

#define areas for each group 
mm <- do.call(rbind, Map(function(g, l,u) { 
    data.frame(group=g, x=dx$x, y=dx$y, below=dx$x<l, above= dx$x > u) 
}, df.group$group, df.group$lower, df.group$upper)) 

#plot data 
p2<-ggplot(mm) + 
    geom_area(aes(x, y, fill=interaction(below,above))) + 
    geom_vline(data=df.group, aes(xintercept=lower)) + 
    geom_vline(data=df.group, aes(xintercept=upper)) + 
    facet_wrap(~group) 

enter image description here

Смежные вопросы