#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')
Вывод: