2015-07-04 93 views
5

我试图在R中使用一组1000之间的随机数创建密度曲线,并对小于或等于到一定的价值。有很多解决方案在那里涉及geom_areageom_ribbon,但他们都需要yval,我没有(它只是一个1000个数字的向量)。关于如何做到这一点的任何想法?其他如何在ggplot中遮挡部分密度曲线(没有y轴数据)

两个相关的问题:

  1. 是否有可能做同样的事情累积密度函数(我目前使用stat_ecdf生成一个),或阴影它呢?
  2. 有什么方法可以编辑geom_vline,所以它只会达到密度曲线的高度,而不是整个y轴?

代码:(该geom_area是一次失败的尝试修改一些代码,我发现如果我手动设置ymax,我只是得到一列占用了整个情节,而不仅仅是区域的曲线下。)

set.seed(100) 

amount_spent <- rnorm(1000,500,150) 
amount_spent1<- data.frame(amount_spent) 
rand1 <- runif(1,0,1000) 
amount_spent1$pdf <- dnorm(amount_spent1$amount_spent) 

mean1 <- mean(amount_spent1$amount_spent) 

#density/bell curve 
ggplot(amount_spent1,aes(amount_spent)) + 
    geom_density(size=1.05, color="gray64", alpha=.5, fill="gray77") + 
    geom_vline(xintercept=mean1, alpha=.7, linetype="dashed", size=1.1, color="cadetblue4")+ 
    geom_vline(xintercept=rand1, alpha=.7, linetype="dashed",size=1.1, color="red3")+ 
    geom_area(mapping=aes(ifelse(amount_spent1$amount_spent > rand1,amount_spent1$amount_spent,0)), ymin=0, ymax=.03,fill="red",alpha=.3)+ 
    ylab("")+ 
    xlab("Amount spent on lobbying (in Millions USD)")+ 
    scale_x_continuous(breaks=seq(0,1000,100)) 
+2

我认为在这种情况下,它可能会更容易要么计算密度ggplot以外,也可以使用日EPLOT内部得到y值。如果'p'是你的基本密度图:'d < - ggplot_build(p)$ data [[1]]; p + geom_area(data = subset(d,x> rand1),aes(x = x,y = y),fill =“red”)' – user20650

回答

8

有几个问题显示这个...... herehere,但他们计算绘图前的密度。

这是另一种方式,比要求的复杂程度更复杂,允许ggplot为您做一些计算。

# Your data 
set.seed(100) 
amount_spent1 <- data.frame(amount_spent=rnorm(1000, 500, 150)) 

mean1 <- mean(amount_spent1$amount_spent) 
rand1 <- runif(1,0,1000) 

基本密度图

p <- ggplot(amount_spent1, aes(amount_spent)) + 
      geom_density(fill="grey") + 
      geom_vline(xintercept=mean1) 

您可以使用ggplot_build剧情对象提取该区域的xy位置阴影。线性插值用于在x=rand1

# subset region and plot 
d <- ggplot_build(p)$data[[1]] 

p <- p + geom_area(data = subset(d, x > rand1), aes(x=x, y=y), fill="red") + 
      geom_segment(x=rand1, xend=rand1, 
         y=0, yend=approx(x = d$x, y = d$y, xout = rand1)$y, 
         colour="blue", size=3) 

enter image description here

+1

有十几个问题要求相同的事情,这个答案是最干净的。 – kmm