Объединить 3 гистограммы в одну

#r

#r

Вопрос:

У меня есть три гистограммы, которые мне нужно объединить в одну, где значения будут отображаться рядом друг с другом (сравнение количества компаний, открытых за 3 разных года, сгруппированных по месяцам) — логика такого типа: https://community.qlik.com/t5/image/serverpage/image-id/37330iA30E2E5966D31DBD/image-size/large?v=1.0amp;px=999.

Не могли бы вы, пожалуйста, предложить способ, как улучшить мою часть «Создание графиков», чтобы она генерировала не три графика, а один, содержащий данные за все три года?

Набор данных: https: //gofile.io/d/ZpbXAB

Спасибо!

 # Install needed packages
install.packages("dplyr")
install.packages("tidyverse")
install.packages("ggplot2")

# Import needed packages
library(dplyr)
library(tidyverse)
library(ggplot2)

# Import list of companies
companies <- read.csv("companies.csv", sep=";")

# Drop irrelevant columns
companies <- select(
  companies, 
  opened_on,
  closed
)

# Remove all companies opened before 2018-01-01 or after 2020-12-31
companies <- companies %>% filter(opened_on > "2018-01-01") %>% filter(opened_on < "2020-12-31")

# Count number of companies
companies.count <- nrow(companies) 

# Count number of companies without opened date
companies.usable <- sum(!is.na(companies$opened_on))

# Remove companies with missing data from the dataset (if there are any)
if(companies.count != companies.usable) {
  companies <- companies %>% drop_na(opened_on)
} 

# Remove no longer needed variables
rm(companies.count)
rm(companies.usable)

# Convert dates to months and years only (remove days)
dates <- c(companies$opened_on)
df <- data.frame(dates, stringsAsFactors = FALSE)
df$dates <- as.Date(df$dates, format = "%Y-%m-%d")
companies$opened_on <- format(df$dates, "%Y/%m")

# Remove no longer needed variables
rm(df)
rm(dates)

# Spit companies by years
companies.2018 <- companies[grep("2018/", companies$opened_on), ]
companies.2019 <- companies[grep("2019/", companies$opened_on), ]
companies.2020 <- companies[grep("2020/", companies$opened_on), ]

# Count number of newly opened companies per month
table(companies.2018$opened_on)
table(companies.2019$opened_on)
table(companies.2020$opened_on)

# Create graphs
ggplot(companies.2018)   aes(x = opened_on)   geom_bar()
ggplot(companies.2019)   aes(x = opened_on)   geom_bar()
ggplot(companies.2020)   aes(x = opened_on)   geom_bar()
  

Комментарии:

1. Пожалуйста, укажите companies в своем вопросе использование dput() . Мы не можем воспроизвести вашу проблему без данных!

2. Или вы можете поделиться .csv файлом по ссылке для скачивания. Можно создать график, который вы хотите ggplot2 !

3. Добавлен набор данных

4. Фантастический Мартин. Я добавил возможное решение вашей проблемы, используя данные, которыми вы поделились!

Ответ №1:

Попробуйте этот подход. Я немного изменил ваш код. Вам нужен фасетный график. Вы можете сделать это с ggplot2 помощью . И переменные, такие как год и месяц, могут быть извлечены непосредственно из фрейма данных. Для форматирования дат, которые вы можете использовать as.Date() , и для отображения фасетов в надлежащем формате, который вы можете использовать factor() . Здесь приведен код, который создает график, аналогичный показанному. Я оставил некоторые фрагменты кода, потому что я не знаю, используете ли вы их для других целей:

Во-первых, процесс обработки данных:

 # Import needed packages
library(dplyr)
library(tidyverse)
library(ggplot2)

# Import list of companies
companies <- read.csv("companies.csv", sep=";")

# Drop irrelevant columns
companies <- select(
  companies, 
  opened_on,
  closed
)
#Format date
companies$opened_on <- as.Date(as.character(companies$opened_on))
# Remove all companies opened before 2018-01-01 or after 2020-12-31
companies <- companies %>% filter(opened_on > as.Date("2018-01-01")) %>%
  filter(opened_on < as.Date("2020-12-31"))

# Count number of companies
companies.count <- nrow(companies) 

# Count number of companies without opened date
companies.usable <- sum(!is.na(companies$opened_on))

# Remove companies with missing data from the dataset (if there are any)
if(companies.count != companies.usable) {
  companies <- companies %>% drop_na(opened_on)
} 

# Remove no longer needed variables
rm(companies.count)
rm(companies.usable)
  

Теперь мы форматируем, извлекаем переменные и вычисляем количество:

 #Extract year and month in same data
companies$Year <- format(companies$opened_on,'%Y')
companies$Month <- format(companies$opened_on,'%b')

#Compute counts
dfcounts <- companies %>% group_by(Year,Month) %>%
  summarise(N=n())
#Format months
dfcounts$Month <- factor(dfcounts$Month,levels = c('Jan','Feb','Mar','Apr','May',
                                                   'Jun','Jul','Aug','Sep','Oct',
                                                   'Nov','Dec'),ordered = T)
dfcounts$Year <- factor(dfcounts$Year)
  

Наконец, мы строим:

 #Now plot
ggplot(dfcounts,aes(x=Year,y=N,group=Month,fill=Year)) 
  geom_bar(stat = 'identity',position = position_dodge(0.9)) 
  facet_wrap(.~Month,nrow = 1,strip.position = 'bottom') 
  theme(legend.position = 'top',
        axis.text.x = element_text(angle=45),
        strip.background = element_blank(),
        axis.text = element_text(color='black',face='bold'),
        axis.title = element_text(color='black',face='bold'),
        strip.text = element_text(color='black',face='bold'),
        legend.text = element_text(color='black',face='bold'),
        legend.title = element_text(color='black',face='bold'),
        plot.title = element_text(color='black',face='bold',hjust=0.5)) 
  geom_text(aes(label=N),position = position_dodge(0.9),vjust=-0.5,size=3,fontface='bold') 
  scale_y_continuous(labels = scales::comma) 
  ggtitle('My title')
  

Вывод:

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