我试图创建一个堆叠条形图的一个响应随着时间的推移(年)在3个不同的网站,我已经分为不同的方面(facet_wrap).我想每个方面不同的 colored颜色 ,我认为实现这一点的最简单的方法是创建一个新的变量('Col_Var'),但保持每个网站的方面.这就是我想要的

enter image description here

但我想要一个simpler legend,所有较深的 colored颜色 (即3个框)都放在‘A类’标签旁边,而3个较浅的 colored颜色 框是‘B类’标签旁边的位置(我的标签理想情况下比这个长得多,所以图例变得非常混乱).换句话说,can I place multiple boxes / symbols next to 1 label in a ggplot legend?下面的一些例子代码,任何帮助或建议都非常感谢,非常感谢.

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

enter image description here

UPDATE如果要将图例放在一行中,可以使用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)
)

enter image description here

R相关问答推荐

基于shiny 应用程序中的日期范围子集xts索引

如何 bootstrap glm回归、估计95%置信区间并绘制它?

随机森林回归:下拉列重要性

如果行和大于值,则过滤

如何改变x轴比例的列在面

多个模拟序列间的一种预测回归关系

如何通过ggplot2添加短轴和删除长轴?

SHINY:使用JS函数应用的CSS样式显示HTML表格

如何将SAS数据集的列名和列标签同时包含在r中GT表的表首?

以NA为通配符的R中的FULL_JOIN以匹配其他数据中的任何值.Frame

有没有一种方法可以同时对rhandsontable进行排序和从rhandsontable中删除?

从非重叠(非滚动)周期中的最新数据向后开窗并在周期内计数

从多层嵌套列表构建Tibble?

如何在R中使用hmm TMB提前一步预测观察到的状态?

使用gt_summary是否有一种方法来限制每个变量集进行配对比较?

将仪表板中的值框大小更改为Quarto

把代码写成dplyr中的group_by/摘要更简洁吗?

如何使用list_rind在列表中保留已命名但不包含第0行的记录?

列间序列生成器的功能

如果y中存在x中的值,则将y行中的多个值复制到相应的x行中