2015-07-04 8 views
5

Sto provando a creare una curva di densità in R utilizzando un insieme di numeri casuali tra 1000 e ombreggia la parte che è minore o uguale ad un certo valore. Ci sono un sacco di soluzioni là fuori che coinvolgono geom_area o geom_ribbon, ma tutti richiedono uno yval, che non ho (è solo un vettore di 1000 numeri). Qualche idea su come potrei fare questo? altriCome sfumare parte di una curva di densità in ggplot (senza dati sull'asse y)

Due questioni connesse:

  1. E 'possibile fare la stessa cosa per una funzione cumulativa densità (Attualmente sto usando stat_ecdf per generare uno), o in ombra a tutti?
  2. C'è un modo per modificare geom_vline in modo che salga solo fino all'altezza della curva di densità, piuttosto che l'intero asse y?

Codice: (il geom_area è un fallito tentativo di modificare un codice che ho trovato Se ho impostato ymax manualmente, ottengo solo una colonna di occupare l'intera trama, invece che solo l'area sotto la curva.)

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

Credo che in questo caso può essere più facile o calcolare la densità di fuori di ggplot, o utilizzare esimo interni ePlot. Se 'p' è il tuo grafico di densità di base:' d <- ggplot_build (p) $ data [[1]]; p + geom_area (data = sottoinsieme (d, x> rand1), aes (x = x, y = y), fill = "red") ' – user20650

risposta

8

Ci sono un paio di domande che mostrano questo ... here e here, ma calcolano la densità prima del tracciamento.

Questo è un altro modo, più complicato del necessario sicuro, che consente a ggplot di eseguire alcuni dei calcoli per te.

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

trama di base della densità

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

è possibile estrarre il x e y posizioni per l'area da ombra dall'oggetto grafico usando ggplot_build. L'interpolazione lineare è stato utilizzato per ottenere il valore y a 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

Ci sono una dozzina di domande che richiedono la stessa cosa e questa risposta è la più pulita. – kmm

Problemi correlati