#Source: https://t.me/rstudioprogr
library(ggplot2)
library(dplyr)
##
## Присоединяю пакет: 'dplyr'
## Следующие объекты скрыты от 'package:stats':
##
## filter, lag
## Следующие объекты скрыты от 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
library(viridis)
## Загрузка требуемого пакета: viridisLite
# Создание датафрейма с выручкой
revenue_data <- data.frame(
Segment = c("Construction & engineering", "Electrical & power", "General industrial", "Agricultural"),
Revenue = c(1733, 1327, 1163, 200) # в миллиардах долларов
)
# Данные о распределении по размерам компаний
distribution_data <- data.frame(
Segment = c("Construction & engineering", "Electrical & power", "General industrial", "Agricultural"),
Less_than_2B = c(40, 20, 15, 30),
Between_2B_5B = c(30, 25, 20, 25),
Between_10B_50B = c(25, 45, 50, 40),
Greater_than_50B = c(5, 10, 15, 5))
# Преобразование в длинный формат и объединение с данными о выручке
data_long <- distribution_data %>%
pivot_longer(cols = -Segment, names_to = "Company_Size", values_to = "Percentage") %>%
left_join(revenue_data, by = "Segment")
# Уточнение порядкового уровня для размера компании
data_long$Company_Size <- factor(
data_long$Company_Size,
levels = c("Less_than_2B", "Between_2B_5B", "Between_10B_50B", "Greater_than_50B"),
labels = c("Less than $2B", "$2B–$5B", "$10B–$50B", "Greater than $50B"))
# Нормализация выручки для определения ширины столбцов
min_width <- 0.3
max_width <- 1.0
data_long <- data_long %>%
mutate(width = min_width + (Revenue - min(Revenue)) / (max(Revenue) - min(Revenue)) * (max_width - min_width))
# Создание числового индекса для позиционирования столбцов
segment_order <- unique(data_long$Segment)
data_long <- data_long %>%
mutate(segment_index = match(Segment, segment_order), x_position = segment_index)
# Вычисление позиций для устранения зазоров
widths <- data_long %>%
distinct(Segment, width) %>%
arrange(match(Segment, segment_order)) %>%
pull(width)
# Создание смещений для центрирования столбцов
cumulative_widths <- cumsum(widths)
x_centers <- cumulative_widths - widths / 2
# Добавление центров к данным
segment_centers <- data.frame(Segment = segment_order, x_center = x_centers)
data_long <- data_long %>%
left_join(segment_centers, by = "Segment")
# Построение графика с переменной шириной столбцов без зазоров
ggplot(data_long, aes(x = x_center, y = Percentage, fill = Company_Size, width = width)) +
geom_col(position = "stack", color = "black") +
scale_x_continuous(breaks = x_centers, labels = segment_order) +
scale_y_continuous(labels = scales::percent_format(scale = 1)) +
labs(title = "Распределение выручки по сегментам и размерам компаний",
x = "Сегмент промышленности",
y = "Доля выручки (%)",
fill = "Размер компании (выручка)") +
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "bottom") +
scale_fill_manual(values = c("#FDB29F", "#DD768C", "#684F7E", "#251766"))
