#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
)