Как я могу создать гистограмму, в которой столбцы расположены друг над другом (перекрывая друг друга)?
Для каждого значения даты (дня) я хочу показать (в виде наложенной полосы), сколько вызовов было пропущено и сколько было выполнено.
В идеале это будет выглядеть так (сделано в 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()