#r #stack #grouping #bar-chart
#r #стек #группировка #гистограмма
Вопрос:
Я пытаюсь создать столбчатую диаграмму по месяцам, которая включает в себя два столбца, причем каждый столбец сложен. Для каждого месяца первым столбцом будет общее количество посещений видео, разделенное на vid_new и vid_return. Вторым столбцом будет общее количество телефонных посещений, разделенное на phone_charge и phone_nocharge.
Я до сих пор не смог правильно расположить столбцы рядом друг с другом. Этот код использует фрейм данных на втором рисунке и считает экземпляры слов «видео» и «телефон», а не столбец Count, который приводит к третьему изображению.
plot <- ggplot(data=new_df, aes(x=Month, y = count, fill = gen_type))
geom_bar(stat = "identity", position = "dodge")
Ниже приведен рисунок данных, с которыми я работаю. Я преобразовал ее в несколько разных форм, чтобы попробовать новые методы, но не смог сформировать этот график.
Как я могу создать столбчатую диаграмму по группам и по стеку в ggplot? Какая структура данных мне нужна для ее создания?
Заранее спасибо за ваш совет!
Ответ №1:
Вы можете попробовать любой из этих вариантов, изменив размер ваших данных на long и создав дополнительную переменную, чтобы вы могли идентифицировать типы. Здесь код, использующий tidyverse
функции:
library(ggplot2)
library(dplyr)
library(tidyr)
#Date
df <- data.frame(Month=c(rep('Mar',4),rep('Apr',4),rep('May',2)),
spec_type=c('vid_new','vid_return','phone_charge','phone_nocharge',
'vid_new','vid_return','phone_charge','phone_nocharge',
'vid_new','vid_return'),
Count=c(7,85,595,56,237,848,2958,274,205,1079))
#Plot 1
df %>% mutate(Month=factor(Month,levels = unique(Month),ordered = T)) %>%
mutate(Dup=spec_type) %>%
separate(Dup,c('Type','Class'),sep='_') %>% select(-Class) %>%
ggplot(aes(x=Type,y=Count,fill=spec_type))
geom_bar(stat = 'identity',position = 'stack')
facet_wrap(.~Month,strip.position = 'bottom')
theme(strip.placement = 'outside',
strip.background = element_blank())
Вывод:
Или это:
#Plot 2
df %>% mutate(Month=factor(Month,levels = unique(Month),ordered = T)) %>%
mutate(Dup=spec_type) %>%
separate(Dup,c('Type','Class'),sep='_') %>% select(-Class) %>%
ggplot(aes(x=Type,y=Count,fill=spec_type))
geom_bar(stat = 'identity',position = 'fill')
facet_wrap(.~Month,strip.position = 'bottom',scales = 'free')
theme(strip.placement = 'outside',
strip.background = element_blank())
Вывод:
Или это:
#Plot 3
df %>% mutate(Month=factor(Month,levels = unique(Month),ordered = T)) %>%
mutate(Dup=spec_type) %>%
separate(Dup,c('Type','Class'),sep='_') %>% select(-Class) %>%
ggplot(aes(x=Type,y=Count,fill=spec_type))
geom_bar(stat = 'identity',position = position_dodge2(preserve = 'single'))
facet_wrap(.~Month,strip.position = 'bottom',scales = 'free')
theme(strip.placement = 'outside',
strip.background = element_blank())
Вывод:
Для просмотра по месяцам вы можете использовать facet_wrap()
и размещать метки разумным способом.
Комментарии:
1. Большое спасибо за код и объяснение! Это отлично сработало @Duck