Я строю гистограмму с двумя количественными переменными (в двух отдельных столбцах), a и b, для каждой категориальной переменной по оси x. Первые 9 переменных категории - это месяцы, в которых были достигнуты определенные значения, а последний - среднегодовое значение, я хотел бы заполнить последние два столбца (относящиеся к среднегодовому значению) цветом, отличным от предыдущих. , следующий код окрашивает все столбцы одинаково, как мне изменить только те, которые относятся к среднему году? Спасибо!
два значения, которые я хочу построить, следующие:
a= c(10,11,12,13,14,15,16,17,18,14) # (the last one is the average)
b= c(20,19,18,17,16,15,14,13,12,16) # (the last one is the average)
В scale_fill_manual я помещаю цвета в том порядке, в котором я хочу, чтобы они отображались на графике (начиная с левого столбца), но выходные данные не показывают желаемого результата для последних двух столбцов, окрашивая их как остальные столбцы.
Большое спасибо!
df <- data.frame(Mon= c("February", "February", "March", "March", "April", "April", "May", "May", "June", "June", "July", "July", "August", "August", "September", "September", "October", "October", "Year Average to 01/11", "Year Average to 01/11"),
Metrics=c('a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b'),
Values=c(10, 20,11,19,12,18,13,17,14,16,15,15,16,14,17,13,18,12,14,16))
df$Mon <- factor(df$Mon, levels = unique(df$Mon)) # I do this to avoid the re-ordering of the x variables in alphabetical order
ggplot(df)+
geom_bar(
aes(x=Mon, y=Values, fill=Metrics, group=Metrics),
stat='identity', position='dodge'
)+
scale_fill_manual(values=c("#9BD4F5",
"#6CC4EE",
"#9BD4F5",
"#6CC4EE",
"#9BD4F5",
"#6CC4EE",
"#9BD4F5",
"#6CC4EE",
"#9BD4F5",
"#6CC4EE",
"#9BD4F5",
"#6CC4EE",
"#9BD4F5",
"#6CC4EE",
"#9BD4F5",
"#6CC4EE",
"#9BD4F5",
"#6CC4EE",
"#1D8ECE",
"#2E77BB")
)+
geom_text(
aes(x=Mon, y=Values, label=Values, fill=Metrics, group=Metrics),
position = position_dodge(width = 1),
vjust = 2, size = 3
)+
theme(
plot.title = element_text(hjust = 0.5, size = 25),
plot.subtitle = element_text(hjust = 0.5, color = "darkgrey", size = 20),
axis.title = element_text(size = 20),
axis.text = element_text(size = 15),
panel.background = element_rect(fill = "white", color = "white"),
panel.grid.major.y = element_line(color = "grey"),
axis.line = element_line(color = "black")
)+
labs(
x = "",
y = "Values",
title = "OSAT and RTF Overview",
subtitle = "February to October 2022"
)
Одним из вариантов может быть использование вспомогательного столбца для сопоставления с fill
aes с четырьмя категориями: «a», «b», «a_avg» и «b_avg». Во-вторых, создайте палитру цветов заливки в виде именованного вектора, чтобы назначить нужные цвета этим категориям:
library(ggplot2)
df$fill <- ifelse(grepl("^Year", df$Mon), paste(df$Metrics, "avg", sep = "_"), df$Metrics)
pal_fill <- c(
"#9BD4F5",
"#6CC4EE",
"#1D8ECE",
"#2E77BB"
)
names(pal_fill) <- c("a", "b", "a_avg", "b_avg")
ggplot(df, aes(x = Mon, y = Values, fill = fill, group = Metrics)) +
geom_bar(
stat = "identity", position = position_dodge(width = 1),
) +
scale_fill_manual(values = pal_fill, breaks = c("a", "b")) +
geom_text(
aes(label = Values),
position = position_dodge(width = 1),
vjust = 2, size = 3
) +
theme(
plot.title = element_text(hjust = 0.5, size = 25),
plot.subtitle = element_text(hjust = 0.5, color = "darkgrey", size = 20),
axis.title = element_text(size = 20),
axis.text = element_text(size = 15),
panel.background = element_rect(fill = "white", color = "white"),
panel.grid.major.y = element_line(color = "grey"),
axis.line = element_line(color = "black")
) +
labs(
x = "",
y = "Values",
title = "OSAT and RTF Overview",
subtitle = "February to October 2022"
)
Вы можете заполнить взаимодействие месяца и метрики. Это означает, что вам нужно подделать легенду — в этом случае я похитил альфа-шкалу. Я бы также добавил тонкую вертикальную линию, чтобы было понятно, что последние значения являются средними. О, и исправьте метки x, чтобы они не конфликтовали друг с другом.
ggplot(df, aes(Mon, Values)) +
geom_col(aes(fill = interaction(Mon, Metrics), alpha = Metrics),
position = "dodge") +
geom_text(aes(label = Values, group = Metrics), vjust = 2, size = 3,
position = position_dodge(width = 1)) +
geom_vline(xintercept = 9.5, color = "gray", linetype = 2) +
scale_fill_manual(values = c(rep("#9BD4F5", 9), "#1D8ECE",
rep("#6CC4EE", 9), "#2E77BB"),guide = "none") +
scale_alpha_manual(values = c(1, 1)) +
guides(alpha = guide_legend(
override.aes = list(fill = c("#9BD4F5", "#6CC4EE")))) +
theme_classic(base_size = 20) +
theme(plot.title = element_text(hjust = 0.5, size = 25),
plot.subtitle = element_text(hjust = 0.5, color = "darkgrey", size = 20),
axis.text = element_text(size = 15),
axis.text.x = element_text(angle = 45, hjust = 1),
panel.grid.major.y = element_line(color = "grey", linewidth = 0.5),
axis.line = element_line(color = "black")) +
labs(title = "OSAT and RTF Overview", x = NULL,
subtitle = "February to October 2022")
на самом деле, я только что понял, что упустил одну вещь, могу я спросить вас, как мне увеличить размер легенды в этом случае? Еще раз спасибо :)
@SlicerLice, ты имеешь в виду только квадраты в легенде? Это тематические элементы — попробуйте добавить + theme(legend.key.size = unit(1, "cm"))
к вашему сюжету.
Это восхитительно! Спасибо и за решение, и за хорошую идею с вертикальной линией, обязательно реализую.