我正在尝试为 3 个不同站点(我已分成不同方面(facet_wrap))随时间(年)的一个响应创建一个堆积条形图。我希望每个方面有不同的颜色,并且我认为实现此目的的最简单方法是创建一个新变量(“Col_Var”),但保留每个站点的方面。这几乎正是我所追求的。
但我想要一个更简单的图例,其中所有较深的颜色(即 3 个框)都放置在“A 型”标签旁边,3 个浅色框放置在“B 型”旁边(我的标签)理想情况下比这长得多,因此图例变得非常混乱)。换句话说,我可以在 ggplot 图例中的 1 个标签旁边放置多个框/符号吗?下面是一些示例代码,非常感谢任何帮助或建议,非常感谢。
Plot_df <- data.frame(Site = rep(c("Site A","Site B","Site C"),each =10),
Type = rep(c("Type A","Type B"),times =15),
Year = rep(rep(seq(2010,2014,1),each=2),times=3),
Value = rnorm(30, mean=50, sd=10))
Plot_df$Col_Var <- as.factor(paste(Plot_df$Site,Plot_df$Type))
Stacked_Plot_Colours <- "#027E5D" "#89EFC7" "#6F2D01" "#F5773A" "#3A3663" "#8F8ACD"
Stacked_Plot <- ggplot(Plot_df) +
geom_bar(aes(x = as.factor(Year), y = Value, fill = Col_Var),position = "stack",stat =
"identity") +
facet_wrap(~ Site,ncol=1) + scale_fill_manual(values=Stacked_Plot_Colours)+
theme(legend.position = "top",legend.title = element_blank(),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black"))
Stacked_Plot
对于您的图例,一种选择是将每行的前两个标签替换为空字符串,并对最后一个标签进行一些清理:
library(ggplot2)
ggplot(Plot_df) +
geom_bar(aes(x = as.factor(Year), y = Value, fill = Col_Var),
position = "stack", stat =
"identity"
) +
facet_wrap(~Site, ncol = 1) +
scale_fill_manual(
labels = \(x) {
x[!seq_along(x) %in% 5:6] <- ""
gsub("^Site\\s.*?\\s", "", x)
},
values = Stacked_Plot_Colours
) +
theme(
legend.position = "top", legend.title = element_blank(),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")
)
更新 如果您想将图例放在一行中,您可以使用
breaks
参数对类别或键重新排序。但是,这样做还需要在用空字符串替换“不需要的”标签时考虑重新排序的中断:
scale_fill_manual(
breaks = \(x) {
x[c(1, 3, 5, 2, 4, 6)]
},
labels = \(x) {
x[!seq_along(x) %% 3 == 0] <- ""
gsub("^Site\\s.*?\\s", "", x)
},
values = Stacked_Plot_Colours,
guide = guide_legend(nrow = 1)
)