R: добавить количество наблюдений на графике с помощью fill и facet_wrap - PullRequest
0 голосов
/ 22 января 2020

Совершенно новое для R и все еще борется с графиками.

Как отобразить количество наблюдений над всеми полями для скрипки в графе facet_wrap, который также дифференцирует категориальную переменную по цвету?

Здесь пример со встроенным набором данных R "CO2":

graph <- CO2 %>% ggplot(aes(x=Treatment, y=uptake, fill=Type)) + geom_violin(width=1) +   facet_wrap(vars(Plant))
graph + scale_y_continuous(limits=c(0, 50), position = "bottom", labels=scales::number) + labs(title= "CO2 dataset : Upate versus Treatment, Type and Plant", x="Treatment", y="Uptake") + scale_colour_discrete(guide = FALSE)

How to add number of observations on top of violin boxes ?

Существуют решения для более простых графиков (с фасетами, но без цветной заливки), но мне не удалось адаптировать их к этой конфигурации графика.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Вот один из способов сделать это: использовать вспомогательный фрейм данных с итогами и передать от inherit.aes=FALSE до geom_text, чтобы ему не требовалась другая эстетика. Я не уверен, что показываю нужный вам номер, его легко изменить, изменив totals.

totals = CO2 %>% 
  count(Plant) %>% 
  mutate(label=paste('Count:', n), Treatment='nonchilled', uptake=50)
CO2 %>% ggplot(aes(x=Treatment, y=uptake, fill=Type)) + 
  geom_violin(width=1) +   
  facet_wrap(vars(Plant)) +
  scale_y_continuous(limits=c(0, 60), position = "bottom", labels=scales::number) + 
  labs(title= "CO2 dataset : Upate versus Treatment, Type and Plant", x="Treatment", y="Uptake") + 
  scale_colour_discrete(guide = FALSE) +
  geom_text(data=totals, aes(Treatment, uptake, label=label), 
            vjust=0, hjust=0, inherit.aes=FALSE)

enter image description here

0 голосов
/ 22 января 2020

Основываясь на предложении @ Kent-Johnson, вот код, который работает. Now works well!

totals_nonchilled <- CO2 %>% 
  group_by(Plant, Treatment, .drop = FALSE) %>%
  count(Plant) %>% tidyr::spread(key=Treatment, value=n) %>%
  mutate(label=paste(nonchilled), Treatment='nonchilled', uptake=45)

totals_chilled <- CO2 %>% 
  group_by(Plant, Treatment, .drop = FALSE) %>%
  count(Plant) %>% tidyr::spread(key=Treatment, value=n) %>%
  mutate(label=paste(chilled), Treatment='chilled', uptake=45)

totals <- dplyr::bind_rows(totals_nonchilled, totals_chilled)

graph <- CO2 %>%
  ggplot(aes(x=Treatment, y=uptake, fill=Type)) +
  geom_violin(width=1) +
  facet_wrap(vars(Plant))

graph + scale_y_continuous(limits=c(0, 50), position = "bottom", labels=scales::number) + labs(title= "CO2 dataset : Upate versus Treatment, Type and Plant", x="Treatment", y="Uptake") + scale_colour_discrete(guide = FALSE) +
  geom_text(data=totals, aes(Treatment, uptake, label=label), 
            vjust=0, hjust=0, inherit.aes=FALSE)

...