Отображение сумм для гистограммы с накоплением - PullRequest
0 голосов
/ 05 августа 2020

У меня есть следующий фрейм данных:

#>    region product delivery price
#> 1   Japan  laptop      yes   500
#> 2   Japan  laptop       no   400
#> 3   Japan printer      n/a   200
#> 4 America  laptop       no   600
#> 5 America  laptop      yes   620
#> 6 America  laptop      yes   300
#> 7 America printer      n/a   300
#> 8   China  laptop      yes   400

воспроизведен здесь:

structure(list(region = c("Japan", "Japan", "Japan", "America", 
"America", "America", "America", "China"), product = c("laptop", 
"laptop", "printer", "laptop", "laptop", "laptop", "printer", 
"laptop"), delivery = c("yes", "no", "n/a", "no", "yes", "yes", 
"n/a", "yes"), price = c(500, 400, 200, 600, 620, 300, 300, 400
)), row.names = c(NA, -8L), class = c("tbl_df", "tbl", "data.frame"
))

и следующий код генерирует гистограмму, сравнивающую цены на ноутбуки и принтеры по регионам. Ноутбуки имеют возможность доставки, поэтому в столбце портативных компьютеров есть области «нет» и «да».

ggplot(df, aes(product, y = price, fill = delivery)) + 
  geom_col(position = "stack") + 
  facet_grid(.~region, switch = "x")

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

В соответствующих столбцах мне нужно указать суммарную цену для ноутбуков и принтеров по регионам, а для ноутбуков я также хочу увидеть фиктивную цену для ноутбуков с доставкой и без. Я пробовал:

geom_text(aes(label = price), size = 3, hjust = 0.5, vjust = 3, position = "stack") 

Однако здесь отображаются только отдельные цены в каждом столбце.

1 Ответ

3 голосов
/ 05 августа 2020

Сумма на столбик с накоплением

Если вы хотите добавить сумму на столбец, я предлагаю вам вычислить ее заранее, а затем запросить.

# This calculates the totals per category
tots = df %>%
  group_by(region, product) %>%
  summarise(total=sum(price)) 

# This plots the results
df %>%
  ggplot(aes(product, y = price, fill = delivery)) + 
  geom_col(position = "stack") + 
  facet_grid(.~region, switch = "x") +
  geom_text(aes(product, total, fill= NULL, label = total), data=tots, size = 3, hjust = 0.5, vjust = 3, position = "stack") 

geom_text использует фрейм данных tots, который содержит итоговые значения для запроса.

Результат следующий:

enter image description here

Adding subtotal per delivery

No big difference, you just have to add a subtotal df and prompt both:

tots = df %>%
  group_by(region, product) %>%
  summarise(total=sum(price)) 
stots = df %>%
  group_by(region, product, delivery) %>%
  summarise(stotal=sum(price)) %>% 
  arrange(desc(delivery))
df %>%
  ggplot(aes(product, y = price, fill = delivery)) + 
  geom_col(position = "stack") + 
  facet_grid(.~region, switch = "x") +
  geom_text(aes(product, stotal, fill= NULL, label = stotal), data=stots, size = 3, hjust = 0.5, vjust = 3, position = "stack") +
  geom_text(aes(product, total, fill= NULL, label = total, fontface=2), data=tots, size = 4, hjust = 0.5, vjust = -0.5, position = "stack") 

Я сделал это (и изменил шрифт на 2, чтобы общее число было жирным)

enter image description here

Adding the cumulative sum per delivery inside

Pretty much the same trick, but aggregating the tots data before. I did it by doing arrange and mutate on top of summarise, and precising delivery in the group_by.

tots2 = df %>%
  group_by(region, product, delivery) %>%
  summarise(total=sum(price)) %>% 
  arrange(desc(delivery)) %>% 
  mutate(cumtot=cumsum(total))
df %>%
  ggplot(aes(product, y = price, fill = delivery)) + 
  geom_col(position = "stack") + 
  facet_grid(.~region, switch = "x") +
  geom_text(aes(product, total, fill= NULL, label = cumtot), data=tots2, size = 3, hjust = 0.5, vjust = 3, position = "stack") 

Output:

enter image description here

Cumulative sum

I calculated the cumulated price before plotting it like this:

df %>%
  group_by(region, product) %>%
  arrange(desc(delivery)) %>% 
  mutate(cum_price = cumsum(price)) %>% 
  ggplot(aes(product, y = price, fill = delivery)) + 
  geom_col(position = "stack") + 
  facet_grid(.~region, switch = "x") +
  geom_text(aes(label = cum_price), size = 3, hjust = 0.5, vjust = 3, position = "stack") 

The arrangeis added to ensure your sum is cumulated in the same order as your plot.

Result is the following:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...