web-dev-qa-db-fra.com

Comment ajouter la moyenne et le mode à l'histogramme ggplot?

J'ai besoin d'ajouter une ligne moyenne et la valeur du mode par exemple à ce genre de tracés:

J'utilise ceci pour calculer le nombre de bacs:

bw <- diff(range(cars$lenght)) / (2 * IQR(cars$lenght) / length(cars$lenght)^(1/3))

Et l'intrigue:

ggplot(data=cars, aes(cars$lenght)) + 
  geom_histogram(aes(y =..density..), 
                 col="red",
                 binwidth = bw,
                 fill="green", 
                 alpha=1) + 
  geom_density(col=4) + 
  labs(title='Lenght Plot', x='Lenght', y='Times')

cars$lenght

168,8 168,8 171,2 176,6 176,6 177,3 192,7 192,7 192,7 178,2 176,8 176,8 176,8 176,8 189,0 189,0 193,8 197,0 141,1 155,9 158,8 157,3 157,3 157,3 157,3 157,3 157,3 157,3 174,6 173,2

Merci d'avance.

8
Borja_042

Je ne sais pas comment répliquer vos données, j'ai donc utilisé cars$speed à sa place.

geom_vline placera les lignes verticales où vous le souhaitez et vous pourrez calculer la moyenne et le mode des données brutes à la volée. Mais si vous voulez que le mode soit le bac d'histogramme avec la fréquence la plus élevée, vous pouvez l'extraire de l'objet ggplot.

Je ne sais pas trop comment vous voulez définir le mode, j'ai donc tracé un tas d'approches différentes.

# function to calculate mode
fun.mode<-function(x){as.numeric(names(sort(-table(x)))[1])}

bw <- diff(range(cars$length)) / (2 * IQR(cars$speed) / length(cars$speed)^(1/3))
p<-ggplot(data=cars, aes(cars$speed)) + 
  geom_histogram(aes(y =..density..), 
                 col="red",
                 binwidth = bw,
                 fill="green", 
                 alpha=1) + 
  geom_density(col=4) + 
  labs(title='Lenght Plot', x='Lenght', y='Times')

# Extract data for the histogram and density peaks
data<-ggplot_build(p)$data
hist_peak<-data[[1]]%>%filter(y==max(y))%>%.$x
dens_peak<-data[[2]]%>%filter(y==max(y))%>%.$x

# plot mean, mode, histogram peak and density peak
p%+%
  geom_vline(aes(xintercept = mean(speed)),col='red',size=2)+
  geom_vline(aes(xintercept = fun.mode(speed)),col='blue',size=2)+
  geom_vline(aes(xintercept = hist_peak),col='orange',size=2)+
  geom_vline(aes(xintercept = dens_peak),col='purple',size=2)+
  geom_text(aes(label=round(hist_peak,1),y=0,x=hist_peak),
            vjust=-1,col='orange',size=5)

enter image description here

14
dule arnaux