使用 ggplot2 和 geom_sf 向图例添加点

Adding point to legend with ggplot2 and geom_sf

我正在创建一张地图,然后在上面添加一些城市,并且我想要有多个图例项。

到目前为止我有这个代码:

library(tidyverse)
library(raster)
library(sf)
library(maptools)

#a location to add to the map
city <- tibble(y = c(47.7128),
               x = c(74.0060))

city <- st_as_sf(city, coords = c("x", "y"), crs = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0")

#world map to plot, along with a raster of distance from a point
data(wrld_simpl)
wrld_simpl_sf <- sf::st_as_sf(wrld_simpl)
r <- raster(wrld_simpl, res = 1)
wrld_r <- rasterize(wrld_simpl, r)

#
pt1 <- matrix(c(100,0), ncol = 2)
dist1 <- distanceFromPoints(r, pt1)
values(dist1)[values(dist1) > 5e6] <- NA
plot(dist1)

gplot_data <- function(x, maxpixels = 50000)  {
  x <- raster::sampleRegular(x, maxpixels, asRaster = TRUE)
  coords <- raster::xyFromCell(x, seq_len(raster::ncell(x)))
  ## Extract values
  dat <- utils::stack(as.data.frame(raster::getValues(x))) 
  names(dat) <- c('value', 'variable')

  dat <- dplyr::as.tbl(data.frame(coords, dat))

  if (!is.null(levels(x))) {
    dat <- dplyr::left_join(dat, levels(x)[[1]], 
                            by = c("value" = "ID"))
  }
  dat
}

gplot_dist1 <- gplot_data(dist1)
gplot_wrld_r <- gplot_data(wrld_r)



#plot data
ggplot() +
  geom_sf(data = wrld_simpl_sf, fill = "grey20",
          colour = "white", size = 0.2) +
  geom_tile(data = gplot_dist1, 
            aes(x = x, y = y, fill = value)) +
  scale_fill_gradient("Distance",
                      low = 'yellow', high = 'blue',
                      na.value = NA) +
  geom_sf(data = city, fill = "red", color = "red", size = 3, shape = 21)

哪个returns:

一切都很好,但现在我只想将 geom_sf(data = city, fill = "red", color = "red", size = 3, shape = 21) 中的红点添加到图例中,标题为 "Cities"。

您可以使用 scale_color_manual 函数。我理解的方式(我今天发现了这一点),它允许您将颜色映射到 "levels" 然后出现在图例中。

将您的代码更改为具有以下内容即可解决问题。

geom_sf(data = city, fill = "red", aes(color = "Cities"), size = 3, shape = 21) +
scale_color_manual(值=c("Cities" = "red"))

This is the result