更改 geom_rect 的图例以显示线型
Changing legend for geom_rect to show line types
尊敬的 R 和 ggplot 用户
我想绘制一张地图,里面有一些矩形组。每个组都必须用不同的线型绘制,并且必须填充一个组。我用这个代码得到了地图
library("tidyverse")
library("ggplot2")
library("sf")
library("rnaturalearth")
library("rnaturalearthdata")
world <- ne_countries(scale = "medium", returnclass = "sf")
x1.SST <- c(-2,0,0,-2)
x2.SST <- c(5,10,13,15)
y1.SST <- c(37,40,36,35)
y2.SST <- c(41,45,45,45)
x1.WV <- c(1,2.5,-3)
x2.WV <- c(5,8,10.25)
y1.WV <- c(37.5,39.5,35)
y2.WV <- c(40.5,43.75,45)
x1.CM <- c(2,1,8)
x2.CM <- c(3.5,3.5,14)
y1.CM <- c(39,41,45.5)
y2.CM <- c(40,44,47.5)
d.SST <- data.frame(x1=x1.SST, x2=x2.SST, y1=y1.SST, y2=y2.SST,
SST=c('MALL SST','AUD SST','VAIA SST','WMED'), r=c(1,2,3,4))
d.WV <- data.frame(x1=x1.WV, x2=x2.WV, y1=y1.WV, y2=y2.WV,
WV=c('MALL WV','AUD WV','VAIA WV'), r=c(1,2,3))
d.CM <- data.frame(x1=x1.CM, x2=x2.CM, y1=y1.CM, y2=y2.CM,
CM=c('MALL CM','AUD CM','VAIA CM'), r=c(1,2,3))
ggplot(data = world) + geom_sf(fill = "lavender") +
coord_sf(xlim = c(-5, 16), ylim = c(34,48)) + xlab("") + ylab("")
geom_rect(data=d.SST, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, colour=SST), fill=NA, alpha=0.5, size=1) +
geom_rect(data=d.WV, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, colour=WV), fill=NA, alpha=0.5, size=1, linetype = 2) +
geom_rect(data=d.CM, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, colour=CM), fill="blue", alpha=0.2, size=0.5, linetype = 1) +
theme_light()
有了这个结果
我现在需要的是将图例拆分为 SST、WV 和 CM 的三个不同部分,并显示非填充矩形的线型。看到并尝试了 scale_fill_manual 和 scale_shape_manual 但没有成功。
不知道我错过了什么,如有任何帮助,我们将不胜感激。
这是部分解决方案。
如果你想让元素出现在图例中,你需要在美学里面映射它们。
这应该是做 3 个分开的图例的替代方法,我不知道是否可以用 ggplot
轻松完成,而无需深入。
library("tidyverse")
library("ggplot2")
library("sf")
#> Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1
library("rnaturalearth")
library("rnaturalearthdata")
world <- ne_countries(scale = "medium", returnclass = "sf")
x1.SST <- c(-2,0,0,-2)
x2.SST <- c(5,10,13,15)
y1.SST <- c(37,40,36,35)
y2.SST <- c(41,45,45,45)
x1.WV <- c(1,2.5,-3)
x2.WV <- c(5,8,10.25)
y1.WV <- c(37.5,39.5,35)
y2.WV <- c(40.5,43.75,45)
x1.CM <- c(2,1,8)
x2.CM <- c(3.5,3.5,14)
y1.CM <- c(39,41,45.5)
y2.CM <- c(40,44,47.5)
d.SST <- data.frame(x1=x1.SST, x2=x2.SST, y1=y1.SST, y2=y2.SST,
SST=c('MALL SST','AUD SST','VAIA SST','WMED'), r=c(1,2,3,4))
d.WV <- data.frame(x1=x1.WV, x2=x2.WV, y1=y1.WV, y2=y2.WV,
WV=c('MALL WV','AUD WV','VAIA WV'), r=c(1,2,3))
d.CM <- data.frame(x1=x1.CM, x2=x2.CM, y1=y1.CM, y2=y2.CM,
CM=c('MALL CM','AUD CM','VAIA CM'), r=c(1,2,3))
# create a new tibble with bound data from the 3 previous data frames
d = d.SST %>%
rename(group2 = SST) %>%
mutate(group1 = "SST") %>%
bind_rows(d.WV %>% rename(group2 = WV) %>% mutate(group1 = "WV")) %>%
bind_rows(d.CM %>% rename(group2 = CM) %>% mutate(group1 = "CM"))
world %>%
ggplot() +
geom_sf(fill = "lavender") +
coord_sf(xlim = c(-5, 16), ylim = c(34,48)) +
xlab("") +
ylab("") +
geom_rect(data = d,
aes(xmin = x1,
xmax = x2,
ymin = y1,
ymax = y2,
color = group2,
size = group1,
fill = group1,
alpha = group1,
linetype = group1)) +
scale_fill_manual("legend1", values = c("SST" = NA, "WV" = NA, "CM" = "blue")) +
scale_alpha_manual("legend1", values = c("SST" = 0, "WV" = 0, "CM" = 0.2)) +
scale_size_manual("legend1", values = c("SST" = 1, "WV" = 1, "CM" = 0.5)) +
scale_linetype_manual("legend1", values = c("SST" = 1, "WV" = 2, "CM" = 1)) +
scale_color_viridis_d("legend2") +
theme_light() +
guides(color = guide_legend(override.aes = list(fill = NA), order = 2),
fill = guide_legend(override.aes = list(color = "black")))
由 reprex package (v2.0.0)
于 2021 年 10 月 1 日创建
尊敬的 R 和 ggplot 用户
我想绘制一张地图,里面有一些矩形组。每个组都必须用不同的线型绘制,并且必须填充一个组。我用这个代码得到了地图
library("tidyverse")
library("ggplot2")
library("sf")
library("rnaturalearth")
library("rnaturalearthdata")
world <- ne_countries(scale = "medium", returnclass = "sf")
x1.SST <- c(-2,0,0,-2)
x2.SST <- c(5,10,13,15)
y1.SST <- c(37,40,36,35)
y2.SST <- c(41,45,45,45)
x1.WV <- c(1,2.5,-3)
x2.WV <- c(5,8,10.25)
y1.WV <- c(37.5,39.5,35)
y2.WV <- c(40.5,43.75,45)
x1.CM <- c(2,1,8)
x2.CM <- c(3.5,3.5,14)
y1.CM <- c(39,41,45.5)
y2.CM <- c(40,44,47.5)
d.SST <- data.frame(x1=x1.SST, x2=x2.SST, y1=y1.SST, y2=y2.SST,
SST=c('MALL SST','AUD SST','VAIA SST','WMED'), r=c(1,2,3,4))
d.WV <- data.frame(x1=x1.WV, x2=x2.WV, y1=y1.WV, y2=y2.WV,
WV=c('MALL WV','AUD WV','VAIA WV'), r=c(1,2,3))
d.CM <- data.frame(x1=x1.CM, x2=x2.CM, y1=y1.CM, y2=y2.CM,
CM=c('MALL CM','AUD CM','VAIA CM'), r=c(1,2,3))
ggplot(data = world) + geom_sf(fill = "lavender") +
coord_sf(xlim = c(-5, 16), ylim = c(34,48)) + xlab("") + ylab("")
geom_rect(data=d.SST, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, colour=SST), fill=NA, alpha=0.5, size=1) +
geom_rect(data=d.WV, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, colour=WV), fill=NA, alpha=0.5, size=1, linetype = 2) +
geom_rect(data=d.CM, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, colour=CM), fill="blue", alpha=0.2, size=0.5, linetype = 1) +
theme_light()
有了这个结果
我现在需要的是将图例拆分为 SST、WV 和 CM 的三个不同部分,并显示非填充矩形的线型。看到并尝试了 scale_fill_manual 和 scale_shape_manual 但没有成功。
不知道我错过了什么,如有任何帮助,我们将不胜感激。
这是部分解决方案。
如果你想让元素出现在图例中,你需要在美学里面映射它们。
这应该是做 3 个分开的图例的替代方法,我不知道是否可以用 ggplot
轻松完成,而无需深入。
library("tidyverse")
library("ggplot2")
library("sf")
#> Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1
library("rnaturalearth")
library("rnaturalearthdata")
world <- ne_countries(scale = "medium", returnclass = "sf")
x1.SST <- c(-2,0,0,-2)
x2.SST <- c(5,10,13,15)
y1.SST <- c(37,40,36,35)
y2.SST <- c(41,45,45,45)
x1.WV <- c(1,2.5,-3)
x2.WV <- c(5,8,10.25)
y1.WV <- c(37.5,39.5,35)
y2.WV <- c(40.5,43.75,45)
x1.CM <- c(2,1,8)
x2.CM <- c(3.5,3.5,14)
y1.CM <- c(39,41,45.5)
y2.CM <- c(40,44,47.5)
d.SST <- data.frame(x1=x1.SST, x2=x2.SST, y1=y1.SST, y2=y2.SST,
SST=c('MALL SST','AUD SST','VAIA SST','WMED'), r=c(1,2,3,4))
d.WV <- data.frame(x1=x1.WV, x2=x2.WV, y1=y1.WV, y2=y2.WV,
WV=c('MALL WV','AUD WV','VAIA WV'), r=c(1,2,3))
d.CM <- data.frame(x1=x1.CM, x2=x2.CM, y1=y1.CM, y2=y2.CM,
CM=c('MALL CM','AUD CM','VAIA CM'), r=c(1,2,3))
# create a new tibble with bound data from the 3 previous data frames
d = d.SST %>%
rename(group2 = SST) %>%
mutate(group1 = "SST") %>%
bind_rows(d.WV %>% rename(group2 = WV) %>% mutate(group1 = "WV")) %>%
bind_rows(d.CM %>% rename(group2 = CM) %>% mutate(group1 = "CM"))
world %>%
ggplot() +
geom_sf(fill = "lavender") +
coord_sf(xlim = c(-5, 16), ylim = c(34,48)) +
xlab("") +
ylab("") +
geom_rect(data = d,
aes(xmin = x1,
xmax = x2,
ymin = y1,
ymax = y2,
color = group2,
size = group1,
fill = group1,
alpha = group1,
linetype = group1)) +
scale_fill_manual("legend1", values = c("SST" = NA, "WV" = NA, "CM" = "blue")) +
scale_alpha_manual("legend1", values = c("SST" = 0, "WV" = 0, "CM" = 0.2)) +
scale_size_manual("legend1", values = c("SST" = 1, "WV" = 1, "CM" = 0.5)) +
scale_linetype_manual("legend1", values = c("SST" = 1, "WV" = 2, "CM" = 1)) +
scale_color_viridis_d("legend2") +
theme_light() +
guides(color = guide_legend(override.aes = list(fill = NA), order = 2),
fill = guide_legend(override.aes = list(color = "black")))
由 reprex package (v2.0.0)
于 2021 年 10 月 1 日创建