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

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

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

enter image description here

Зеленая часть столбцов представляет часть завершенных чатов (если применимо), поэтому в этом примере пользователь видит, что 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~.) 

Создает этот график:

enter image description here

Проблема с этим графиком заключается в том, что столбцы расположены друг над другом. В этом примере столбец 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 Ответ

0 голосов
/ 27 апреля 2018

Это решает вашу проблему с 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()

enter image description here

...