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:
- E 'possibile fare la stessa cosa per una funzione cumulativa densità (Attualmente sto usando
stat_ecdf
per generare uno), o in ombra a tutti? - 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))
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