Использование ggplot2 stat_summary с помощью geom col для создания отдельной строки суммы

#r #ggplot2

Вопрос:

Я пытаюсь сделать гистограмму с итоговой строкой Total , показывающей сумму двух групп: Pulses, Total и Soybeans .

Я знаю, что этого можно достичь, предварительно обработав данные, чтобы получить сумму в виде сводки по группам, я ищу stat_summary решение. Я не очень хорошо знаком с stat_summary() этим , любые советы приветствуются, так как я мог что-то упустить…

Репрекс:

Данные:

 df <- structure(list(Year = c(2015L, 2016L, 2017L, 2015L, 2016L, 2017L
), Item = c("Soybeans", "Soybeans", "Soybeans", "Pulses, Total", 
"Pulses, Total", "Pulses, Total"), Value = c(884688L, 829166L, 
960640L, 2219455L, 2354696L, 2683772L)), row.names = c(NA, -6L
), class = "data.frame")
 

То, что я пробовал до сих пор:

 library(ggplot2)

ggplot(data = df, aes(x = Year, y = Value))  
  stat_summary(
    fun = sum,
    geom = "col",
    position = position_dodge(width = 0.95),
    aes(fill = "Total")
  )  
  geom_col(
    position = position_dodge(width = 0.95),
    aes(fill = Item)
  )
 

введите описание изображения здесь

Как вы можете видеть, Total панель не отображается как 3-я отдельная панель. Возможно ли достичь этого, сохранив два других и без предварительной обработки данных?

Ожидаемый результат:

 library(dplyr)
df %>% 
  group_by(Year) %>% 
  summarise(Value = sum(Value), Item = "Total") %>% 
  bind_rows(., df) %>% 
  ggplot(data = ., aes(x = Year, y = Value, fill = Item))  
  geom_col(position = "dodge")
 

введите описание изображения здесь

Комментарии:

1. Примечание: geom_col не дает вам итогов Soybeans / Pulses, Total , потому что у вас есть несколько obs для каждой группы Year .

2. Хм, я почти уверен, что решение есть, но оно будет намного сложнее, чем ваш собственный tidyverse подход.

3. @MartinC. Арнольд спасибо за ваш комментарий, это не было намеренно, я думаю, что набор данных находится прямо сейчас (я забыл фильтр, когда сделал его из истинных данных…).

Ответ №1:

Вам нужно использовать position_nudge(x = ..) столбец «Итого» и соответствующим образом задать ширину полосы, например:

 library(ggplot2)

barwidth = 0.3
n = length(unique(df$Item))

ggplot(data = df, aes(x = Year, y = Value))  
  stat_summary(
    fun = sum,
    geom = "col",
    position = position_nudge(x = -1.5*barwidth),
    aes(fill = "Total"),
    width = barwidth
  )  
  geom_col(
    position = position_dodge(),
    aes(fill = Item),
    width= barwidth * n
  )
 

введите описание изображения здесь