2015-07-04 11 views
5

1000 arasında rasgele sayı kümesini kullanarak R'de yoğunluk eğrisi oluşturmaya çalışıyorum ve daha az veya eşit parçayı gölgeleyin belli bir değere. Orada geom_area veya geom_ribbon içeren bir çok çözüm var, ama hepsi (ben sadece 1000 sayı bir vektör) sahip değilim bir yval gerektirir. Bunu nasıl yapabileceğime dair bir fikrin var mı?ggplot'ta yoğunluk eğrisinin bir kısmını gölgeleme (y ekseni verisi olmadan)

iki diğer ilgili sorular:

  1. bir kümülatif yoğunluk (Şu anda bir tane oluşturmak için stat_ecdf kullanıyorum) işlevi, ya da hiç gölge onun için aynı şeyi yapmak mümkün mü?
  2. geom_vline dosyasını düzenlemenin herhangi bir yolu var mı? Böylece, yalnızca y ekseninden ziyade yoğunluk eğrisinin yüksekliğine kadar gider?

Kodu: (geom_area buldum bazı kodunu düzenlemek için başarısız bir girişimdir el ymax ayarlarsanız, sadece eğrinin altındaki bölgeye verilen yerine, bütün arsa kaplıyor bir sütun olsun.)

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

de y değeri elde etmek için kullanıldı. Eğer 'p' temel yoğunluk çiziminiz ise: 'd <- ggplot_build (p) $ data [[1]]; p + geom_area (data = subset (d, x> rand1), aes (x = x, y = y), fill = "kırmızı") ' – user20650

cevap

8

Bunu göstermek için birkaç soru var ... here ve here, ancak çizimden önce yoğunluğu hesaplıyorlar. Bu, sizin için bazı hesaplamaların yapılması için ggplot'un izin verdiğinden daha karmaşık bir yöntemdir.

# 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) 

Temel yoğunluk arsa

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

Sen ggplot_build kullanarak arsa nesneden gölge alanı için x ve y pozisyonları elde edebilirsiniz. Doğrusal interpolasyon Ben ggplot dışında yoğunluğunu hesaplamak veya eplot iç yapıları inci kullanmak için her kolay olabilir bu durumda düşünüyorum 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

Aynı şeyi soran bir düzine soru vardır ve bu cevap en temiz. – kmm

İlgili konular