使用一个标签共享多个 ggplot 图例符号

问题描述 投票:0回答:1

我正在尝试为 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
r ggplot2 bar-chart legend stacked-chart
1个回答
3
投票

对于您的图例,一种选择是将每行的前两个标签替换为空字符串,并对最后一个标签进行一些清理:

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)
)

© www.soinside.com 2019 - 2024. All rights reserved.