Вопрос или проблема
Я создал комбинированный график, используя код:
name <- rep(c("ba", "EW", "RW", "Se", "St", "US", "VN"), 2)
value <- c(0, 6323, 7397, 13945, 11801, 55255, 22519, 4124, 13540, 9616, 57724, 6646, 22021, 8841)
type <- c(rep("g", 7), rep("o", 7))
test <- data.frame(name, value, type)
share <- c(1, .61, .47, .8, .34, .28, .28)
test2 <- data.frame(name2, share)
scaling_factor <- 8e4
ggplot(test, aes(x=name, y=value, fill=type))
+ geom_bar(position = position_stack(reverse = TRUE), stat="identity")
+ theme(plot.title = element_text(hjust = 0.5))
+ scale_fill_manual(values = c("#0099f9", "#69c6ff"))
+ geom_text(aes(label = value), position = position_stack(vjust = 0.5, reverse = TRUE), colour = "black", size = 3)
+ guides(fill = guide_legend(title = "", reverse = TRUE))
+ geom_line(data = test2,
aes(x = name2, y = share * scaling_factor, fill = NULL, group = 1), color = "orange", size = 1)
+ scale_y_continuous(name = "осевая 1", sec.axis = dup_axis(~./80000, name = "осевая 2", labels = scales::percent))
Теперь у меня есть вопросы:
-
добавить подписи данных: geom_text уже используется для подписей данных в стеклянных столбцах, поэтому корректные значения всегда перезаписываются, когда я хочу добавить больше. Я хочу показать долю в процентах.
-
изменить тип линии: я хочу, чтобы линия была с маркерами (как в Excel), так что каждая точка данных также отображалась как точка на линии. Но я только выяснил, как изменить нормальную линию на пунктирную, это не то, что я хочу.
-
добавить легенду: также я не нашел правильный код, чтобы показать легенду для этой линии, существующая легенда для двухцветных столбцов должна остаться.
Ответ или решение
Создание комбинированного графика с использованием столбчатой и линейной диаграммы с двойной осью Y в R
Вам был представлен код, который создает комбинированный график с использованием ggplot2
в R. Ваши требования касаются добавления дополнительных пометок данных, изменения стиля линии и добавления легенды для линейного графика. Давайте разберем каждое из этих запросов и улучшения, необходимые для создания необходимой визуализации.
1. Добавление меток данных для процентного соотношения
Ваш текущий способ добавления меток данных для столбцов уже работает должным образом, но вы хотите отобразить процентное значение из вашего второго набора данных (test2
). Для этого вы можете добавить вторую метку данных, которая визуализирует долю, а не значения из первого набора данных. Вам необходимо изменить подход к добавлению текста.
Сначала давайте обновим код:
# Преобразуем данные для меток
test2$percentage <- test2$share * 100 # Переводим доли в проценты
ggplot(test, aes(x=name, y=value, fill=type)) +
geom_bar(position = position_stack(reverse = TRUE), stat="identity") +
theme(plot.title = element_text(hjust = 0.5)) +
scale_fill_manual(values = c("#0099f9", "#69c6ff")) +
geom_text(aes(label = value), position = position_stack(vjust = 0.5, reverse = TRUE), colour = "black", size = 3) +
geom_text(data = test2, aes(x = name, y = scaling_factor * share, label = paste0(round(percentage, 1), "%")), vjust = -0.5, colour = "orange", size = 3) +
guides(fill = guide_legend(title = "", reverse = TRUE)) +
geom_line(data = test2, aes(x = name, y = share * scaling_factor, fill = NULL, group = 1), color = "orange", size = 1) +
scale_y_continuous(name = "axis 1", sec.axis = dup_axis(~./80000, name = "axis 2", labels = scales::percent))
2. Изменение типа линии с маркерами
Для того чтобы линию с маркерами на графике можно было отобразить так, как это делается в Excel, вам необходимо добавить geom_point()
для каждого значения. Это придаст вашей линии визуальную привлекательность, подчеркивая каждую точку данных.
Модифицируем код следующим образом:
# Добавляем точки на линию
ggplot(test, aes(x=name, y=value, fill=type)) +
geom_bar(position = position_stack(reverse = TRUE), stat="identity") +
theme(plot.title = element_text(hjust = 0.5)) +
scale_fill_manual(values = c("#0099f9", "#69c6ff")) +
geom_text(aes(label = value), position = position_stack(vjust = 0.5, reverse = TRUE), colour = "black", size = 3) +
geom_text(data = test2, aes(x = name, y = scaling_factor * share, label = paste0(round(percentage, 1), "%")), vjust = -0.5, colour = "orange", size = 3) +
geom_line(data = test2, aes(x = name, y = share * scaling_factor, fill = NULL, group = 1), color = "orange", size = 1) +
geom_point(data = test2, aes(x = name, y = share * scaling_factor), color = "orange", size = 2) + # Добавляем маркеры
scale_y_continuous(name = "axis 1", sec.axis = dup_axis(~./80000, name = "axis 2", labels = scales::percent))
3. Добавление легенды для линии
Чтобы добавить легенду для линейной части графика, потребуется указывать color
или linetype
в aes()
внутри geom_line()
. Вы можете добавить дополнительный параметр group
для указания, что линия представляет собой другой тип данных.
Вот как это можно сделать:
# Обновленный график с легендой
ggplot(test, aes(x=name, y=value, fill=type)) +
geom_bar(position = position_stack(reverse = TRUE), stat="identity") +
theme(plot.title = element_text(hjust = 0.5)) +
scale_fill_manual(values = c("#0099f9", "#69c6ff")) +
geom_text(aes(label = value), position = position_stack(vjust = 0.5, reverse = TRUE), colour = "black", size = 3) +
geom_text(data = test2, aes(x = name, y = scaling_factor * share, label = paste0(round(percentage, 1), "%")), vjust = -0.5, colour = "orange", size = 3) +
geom_line(data = test2, aes(x = name, y = share * scaling_factor, color = "Data Share"), group = 1, size = 1) +
geom_point(data = test2, aes(x = name, y = share * scaling_factor, color = "Data Share"), size = 2) + # Добавляем маркеры
scale_y_continuous(name = "axis 1", sec.axis = dup_axis(~./80000, name = "axis 2", labels = scales::percent)) +
scale_color_manual(values = c("Data Share" = "orange")) + # Указываем цвет для легенды
labs(color = "")
Заключение
Теперь вы имеете полностью функциональный комбинированный график с метками данных, отображающими процентное соотношение, с линией, которая содержит маркеры для каждого значения и с корректно отображающейся легендой для линейной части графика. Данный подход позволяет достичь максимально ясного и информативного представления данных, что будет полезно для анализа и презентаций.