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

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

В идеале это будет выглядеть так (сделано в Tableau):

Зеленая часть столбцов представляет часть завершенных чатов (если применимо), поэтому в этом примере пользователь видит, что 1 апреля 2018 года было 1 завершенный чат и 4 пропущенных чата, хотя Total Бар действительно имеет значение 5.

Этот код не соответствует примеру таблицы (так как он не отображается Total), но он движется в правильном направлении:

library(ggplot2)
ggplot(new_data, aes(x = date,
                 y = count,
                 fill = type)) +
  scale_fill_manual(values = c("forestgreen", "red")) +
  geom_bar(data = new_data[new_data$retailer == "Retailer 1", ],
           colour = "black",
           stat = "identity") +
  ggtitle("Completed vs. Missed Calls") +
  geom_bar(data = new_data[new_data$retailer == "Retailer 2", ],
           colour = "black",
           stat = "identity") +
  facet_grid(retailer~.) 

Он производит этот график:

Проблема с этим графиком состоит в том, что столбцы расположены друг над другом. В этом примере Missed (красный) столбец в фасете, представляющий Retailer 1 будет чуть выше зеленого (Completed) столбец, если он расположен за ним, как я хочу, чтобы он отображался.

То, что я хочу сделать, это поставить один бар перед другим.

У меня такой вопрос: как мне создать что-то, что показывает пропущенные чаты поверх завершенных чатов? Лучшее, что я могу придумать, это то, что бары укладываются друг на друга.

Мои данные:

date            type        count   retailer
April 17 2018   Completed   12      Retailer 1
April 17 2018   Missed      13      Retailer 1
April 18 2018   Completed   10      Retailer 2
April 18 2018   Completed   11      Retailer 1
April 18 2018   Missed      5       Retailer 1
April 19 2018   Completed   10      Retailer 1
April 19 2018   Missed      1       Retailer 1
April 20 2018   Completed   2       Retailer 2
April 20 2018   Missed      1       Retailer 1
April 21 2018   Completed   2       Retailer 1
April 21 2018   Completed   1       Retailer 2
April 21 2018   Missed      1       Retailer 1
April 23 2018   Completed   2       Retailer 1
April 23 2018   Missed      2       Retailer 2

НОТА:

Будущая итерация (или возможная эволюция) этого графика покажет Total столбец (который является суммой Completed а также Missed) в фоновом режиме и Missed колонна впереди. В результате получается "иллюзия" своего рода, с разницей между Total а также Missed представляющий количество Completed чаты. Короче, Missed всегда будет меньше или равно общему количеству (поскольку все чаты в определенный день могли быть пропущены. (Missed <= Total.)

1 ответ

Решение

Это решает вашу проблему с tidyr (за spread), dplyr (за mutate) а также ggplot2:

library(dplyr)
library(tidyr)
library(ggplot2)

my_df %>%
  spread(type, count, fill = 0) %>%   # Spread the count column in missed and completed
  mutate(Total = Completed + Missed) %>%   # Create the Total column
  ggplot(aes(date, Total)) + 
  geom_col(aes(fill = "Total")) + # total bar (with stat = "identity")
  geom_col(aes(y = Missed, fill = "Missed")) + # missed bar
  geom_text(aes(label = paste("Total chats:", Total)), # add total label
                hjust = -0.05, vjust = 1) + 
  geom_text(aes(label = paste("Missed chats:", Missed)), # add missed label
                hjust = -0.05, vjust = -0.5, color = "red") + 
  scale_fill_manual(name = "",  # Manual fill scale
                    values = c("Total" = "forestgreen", "Missed" = "red")) +
  facet_grid(retailer~.) +  # Displayed per retailer
  scale_y_continuous(limits = c(0, 40)) + # Make labels visible
  coord_flip() + # switch x and y axes
  theme_minimal()

Другие вопросы по тегам