tmap:在光栅图的图例中围绕键添加矩形框
tmap: add rectangular frame around keys in legend of raster map
我需要在白色背景的栅格地图上为分类栅格数据放置一个 fill-legend,其中白色用于表示冰。我想使用 tmap。这是一个与我当前项目在本质上相似的最小工作示例。
library(tmap)
library(dplyr)
library(forcats)
library(stars)
data(land)
land_copy <-
land %>%
mutate(cover_simplified =
fct_other(cover_cls, keep = c("Snow/ice", "Water")))
tm_shape(land_copy) +
tm_raster(col = "cover_simplified",
palette = c("white", "lightblue", "brown")) +
tm_layout(legend.outside = TRUE)
map produced with tmap, no rectangular frame around legend key
问题是图例中的“Snow/ice”指的是类别不清楚,因为在白底上看不到关键色。因此,“Snow/ice”看起来更像是图例标题而不是图例键。我知道我可以使用 tm_layout(legend.bg.color = "gray")
更改图例背景,但我更喜欢将背景保持为白色。相反,我想在每个周围画一个细长的黑色矩形框
图例键。这是用 ggplot2 实现的想法。
library(ggplot2)
ggplot() +
geom_stars(aes(x, y, fill = cover_simplified), data = land_copy) +
scale_fill_discrete(type = c("white", "lightblue", "brown")) +
coord_sf() +
theme_void() +
theme(legend.key = element_rect(color = "black"))
map produced with ggplot2 with rectangular frame around each legend key
我更愿意使用 tmap 而不是 ggplot2,因为我想要生成的实际地图比上面的示例更复杂,所以 tmap 是完成我的任务的更好工具。我发布这个问题是因为我找不到似乎与我的问题相关的 tm_layout()
的函数参数。 Google 搜索也没有给我带来有用的信息。
有没有办法用 tmap 生成 ggplot2 的 theme(legend.key = element_rect(color = "black")
等价物?
tmap
中似乎没有直接执行此操作的选项。但是,一个tmap
是用网格图形绘制的,所以可以捕获图例,更改它,然后绘制回来。如果您在代码后添加以下行:
g <- grid::grid.grab()
leg <- grid::getGrob(g, "legend")
leg$children[[2]]$children[[2]]$children[[1]]$gp$col <- "black"
leg$children[[2]]$children[[2]]$children[[1]]$gp$lwd <- 1
grid::seekViewport("outside_legend")
grid::grid.draw(leg)
你得到:
如果您想将其另存为 pdf,则不能使用 tmap_save
,因为这不再是 tmap
对象。相反,让情节看起来像你想要的那样,然后做:
g <- grid::grid.grab()
pdf("my_pdf.pdf")
grid::grid.newpage()
grid::grid.draw(g)
dev.off()
我需要在白色背景的栅格地图上为分类栅格数据放置一个 fill-legend,其中白色用于表示冰。我想使用 tmap。这是一个与我当前项目在本质上相似的最小工作示例。
library(tmap)
library(dplyr)
library(forcats)
library(stars)
data(land)
land_copy <-
land %>%
mutate(cover_simplified =
fct_other(cover_cls, keep = c("Snow/ice", "Water")))
tm_shape(land_copy) +
tm_raster(col = "cover_simplified",
palette = c("white", "lightblue", "brown")) +
tm_layout(legend.outside = TRUE)
map produced with tmap, no rectangular frame around legend key
问题是图例中的“Snow/ice”指的是类别不清楚,因为在白底上看不到关键色。因此,“Snow/ice”看起来更像是图例标题而不是图例键。我知道我可以使用 tm_layout(legend.bg.color = "gray")
更改图例背景,但我更喜欢将背景保持为白色。相反,我想在每个周围画一个细长的黑色矩形框
图例键。这是用 ggplot2 实现的想法。
library(ggplot2)
ggplot() +
geom_stars(aes(x, y, fill = cover_simplified), data = land_copy) +
scale_fill_discrete(type = c("white", "lightblue", "brown")) +
coord_sf() +
theme_void() +
theme(legend.key = element_rect(color = "black"))
map produced with ggplot2 with rectangular frame around each legend key
我更愿意使用 tmap 而不是 ggplot2,因为我想要生成的实际地图比上面的示例更复杂,所以 tmap 是完成我的任务的更好工具。我发布这个问题是因为我找不到似乎与我的问题相关的 tm_layout()
的函数参数。 Google 搜索也没有给我带来有用的信息。
有没有办法用 tmap 生成 ggplot2 的 theme(legend.key = element_rect(color = "black")
等价物?
tmap
中似乎没有直接执行此操作的选项。但是,一个tmap
是用网格图形绘制的,所以可以捕获图例,更改它,然后绘制回来。如果您在代码后添加以下行:
g <- grid::grid.grab()
leg <- grid::getGrob(g, "legend")
leg$children[[2]]$children[[2]]$children[[1]]$gp$col <- "black"
leg$children[[2]]$children[[2]]$children[[1]]$gp$lwd <- 1
grid::seekViewport("outside_legend")
grid::grid.draw(leg)
你得到:
如果您想将其另存为 pdf,则不能使用 tmap_save
,因为这不再是 tmap
对象。相反,让情节看起来像你想要的那样,然后做:
g <- grid::grid.grab()
pdf("my_pdf.pdf")
grid::grid.newpage()
grid::grid.draw(g)
dev.off()