Добавьте метки поверх гистограммы в R - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу построить гистограмму и пометить каждый бин по среднему значению некоторой другой переменной.

library(dplyr)
data(mtcars)
meanwt=mtcars %>% group_by(carb) %>% 
  dplyr::summarize(meanwt = mean(wt)) %>% pull(meanwt)
g=
  ggplot(data=mtcars, aes(x=carb, y=..count..)) +
  geom_histogram(alpha=0.3, position="identity", lwd=0.2,binwidth=1)+
  theme_bw()+
  theme(panel.border = element_rect(colour = "black", fill=NA, size=0.7))

Это хорошо работает, когда я строю кол-во бинов

##plot the count of bin  
g+stat_count(aes(y=..count..,label=..count..),geom="text",vjust=-1)

enter image description here

Однако, если я хочу обозначить среднее значение для какой-либо другой переменной, это не сработает.

#plot mean of some other variable
g+stat_summary(aes(x=carb,y=wt),xfun.y = "mean", colour = "Black", size = 2, 
               geom = "text",position=position_dodge(width=0.9), vjust=-0.25,label = meanwt)

enter image description here

Может ли кто-нибудь помочь мне с этим?

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Прежде всего, полезно знать, с чем вы имеете дело и чего хотите достичь.В этом случае вы хотите узнать, сколько машин имеют 1, 2, ..., 8 цилиндров.Поэтому все, что вам нужно сделать, это сгруппировать по цилиндрам и найти, сколько автомобилей выпадает в этой категории:

mm <- mtcars %>% 
              group_by(carb) %>% 
              summarise(n = length(wt))

Далее вы можете использовать простую гистограмму для построения графика cyl против числа.вхождений ( n ):

ggplot(data=mm, aes(x=carb, y=n)) +
  geom_bar(stat="identity", width=0.5, position=position_dodge(), fill = "steelblue") + 
  geom_text(aes(label=n), vjust=1.5, color="white",
            position = position_dodge(0.9), size=4)+ 
  scale_x_continuous(breaks = seq(min(mm$carb), max(mm$carb), 1)) +
  scale_y_continuous(breaks = seq(min(mm$n), max(mm$n), 1)) +
  theme_minimal()

enter image description here

0 голосов
/ 29 сентября 2018

Мне хочется ответить на свой вопрос, объединив помощь @Aleksandr и @Prradep.Я не уверен, что это супер легко читать, но для новичка, как я, это помогло бы.

##reading the library and data
library(dplyr)
data(mtcars)

##aggregating the data (for some strange reason I have to use dplyr:: everytime I use a function within piping)
dat <- mtcars %>% dplyr::select(carb, wt) %>%  
  dplyr::group_by(carb) %>% dplyr::mutate(mean_wt = mean(wt), carb_count = n()) 

##plotting the data
ggplot(data=mtcars, aes(x=carb, y=..count..)) +
  geom_histogram(alpha=0.3, position="identity", lwd=0.2,binwidth=1)+
  theme_bw()+
  theme(panel.border = element_rect(colour = "black", fill=NA, size=0.7))+
  geom_text(data=aggregate(mean_wt~carb+carb_count,dat,mean), aes(carb, carb_count+0.5, label=round(mean_wt,1)), color="black")

enter image description here

0 голосов
/ 28 сентября 2018

Я не уверен, почему предложение Александра не сработало.В качестве альтернативы вы можете использовать это:

dat <- mtcars %>% select(carb, wt) %>%  
  group_by(carb) %>% mutate(mean_wt = mean(wt), carb_count = n()) 
g + geom_text(data=dat, aes(carb, carb_count+0.5, label=mean_wt), color="black", check_overlap = TRUE)

enter image description here

По предложению Тунга!

...