修改ggplot2多面板图中的图例

3
对于这个图表,我想把图例分成两个独立的图例。一个图例显示脉冲湿地为圆圈,阴影对应湿地编号,另一个图例显示静态湿地为三角形,灰度对应湿地编号。然后水文图例就不必要了,我想摆脱它。
以下是我想要的图例(当然要小一些。这只是用PowerPoint演示)。
图片链接:https://istack.dev59.com/U4hvO.webp 我将数据和代码粘贴如下。
日期 水文学 湿地 温度 层
1   6月15日 脉冲式 一 21.9 表层
2   6月15日 脉冲式 一 21.0 底部
3    7月1日 脉冲式 一 28.8 表层
4    7月1日 脉冲式 一 23.5 底部
5   7月10日 脉冲式 一 31.8 表层
6   7月10日 脉冲式 一 22.6 底部
7   7月14日 脉冲式 一 23.0 表层
8   7月14日 脉冲式 一 21.4 底部
9   8月15日 脉冲式 一 28.8 表层
10  8月15日 脉冲式 一 28.5 底部
11  11月7日 脉冲式 一 12.1 表层
12  11月7日 脉冲式 一 9.9 底部
13  6月15日 静态的 二 22.2 表层
14  6月15日 静态的 二 21.2 底部
15   7月1日 静态的 二 29.0 表层
16   7月1日 静态的 二 24.1 底部
17  7月10日 静态的 二 30.9 表层
18  7月10日 静态的 二 23.3 底部
19  7月14日 静态的 二 25.2 表层
20  7月14日 静态的 二 22.6 底部
21   8月1日 静态的 二 27.3 表层
22   8月1日 静态的 二 23.5 底部
23  8月15日 静态的 二 26.7 表层
24  8月15日 静态的 二 23.6 底部
25  11月7日 静态的 二 11.9 表层
26  11月7日 静态的 二 9.0 底部
27  6月15日 脉冲式 三 21.3 表层
28  6月15日 脉冲式 三 20.9 底部
29   7月1日 脉冲式 三 26.1 表层
30   7月1日 脉冲式 三 23.8 底部
31  7月10日 脉冲式 三 30.1 表层
32  7月10日 脉冲式 三 22.8 底部
33  7月14日 脉冲式 三 23.7 表层
34  7月14日 脉冲式 三 22.2 底部
35  11月7日 脉冲式 三 12.5 表层
36  11月7日 脉冲式 三 10.0 底部
37  6月15日 静态的 四 21.0 表层
38  6月15日 静态的 四 19.3 底部
39   7月1日 静态的 四 25.0 表层
40   7月1日 静态的 四 21.2 底部
41  7月10日 静态的 四 25.7 表层
42  7月10日 静态的 四 21.3 底部
43  7月14日 静态的 四 

代码

colvec <-c("white", "white","gray80", "gray80", "gray60", "gray60", "gray37", "gray37","black", "black")  
water$Layer=factor(water$Layer, c("Surface", "Bottom"))
water$Date=factor(water$Date, c("15-Jun", "1-Jul", "10-Jul", "14-Jul", "1-Aug", "15-Aug", "7-Nov"))
water$Wetland=factor(water$Wetland, c("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"))

ggplot(water, aes(Date, Temp, group=Wetland, shape=Hydrology)) +
  geom_point(size =4, color = "black")+
  geom_point(aes(color=Wetland),size=3) +
  scale_colour_manual(values=colvec) +
  facet_grid(Layer ~ Hydrology) 

感谢您的来信,
-Sarah
1个回答

5
这里有一个灵感来自于这个问题的解决方案。
首先,创建一个新变量colvec2,它只包含所有颜色一次。
colvec2 <-c("white", "gray80", "gray60", "gray37",  "black")  
colvec <-c("white", "white","gray80", "gray80", "gray60", "gray60", "gray37", "gray37","black", "black")  

将原始图表保存为对象并去掉图例。

p<-ggplot(water, aes(Date, Temp, group=Wetland, shape=Hydrology)) +
  geom_point(aes(color=Wetland),size=3) +
  scale_colour_manual(values=colvec) +
  facet_grid(Layer ~ Hydrology) +
  theme(legend.position="none")

仅包含“Pulsed”数据的图。在geom_point()中设置shape=16。使用scale_colour_manual()更改图例标题和颜色。

p1<-ggplot(subset(water,Hydrology=="Pulsed"), 
     aes(Date, Temp, group=Wetland, shape=Hydrology)) +
  geom_point(aes(color=Wetland),size=3,shape=16) +
  scale_colour_manual("Pulsed Wetlands",values=colvec2) +
  facet_grid(Layer ~ Hydrology)

与相同,只不过是针对Static
p2<-ggplot(subset(water,Hydrology=="Static"), 
      aes(Date, Temp, group=Wetland, shape=Hydrology)) +
  geom_point(aes(color=Wetland),size=3,shape=17) +
  scale_colour_manual("Static Wetlands",values=colvec2) +
  facet_grid(Layer ~ Hydrology)

使用ggplot_build()ggplot_gtable()保存图表p1p2

pt1<-ggplot_gtable(ggplot_build(p1))
pt2<-ggplot_gtable(ggplot_build(p2))

提取两个图表中的图例组件。这次图例位于第12个元素(包含 guide-box 的元素)中。
leg1<-pt1$grobs[[12]]
leg2<-pt2$grobs[[12]]

现在使用 grid.arrange()arrangeGrob() 来绘制所有部分。
library(gridExtra)
grid.arrange(arrangeGrob(p,arrangeGrob(leg1,leg2), ncol = 2,widths=c(3/4,1/4)))

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接