【问题标题】:Reorganize sf multi-plot and add a legend重组 sf 多图并添加图例
【发布时间】:2019-03-29 05:59:48
【问题描述】:

我正在尝试使用sf::plot 并排绘制两张地图,但我无法让它工作。有两个问题,第一个是情节是相互重叠而不是并排的,第二个是我失去了图例。

这是一个例子和更多的解释。

library(sf) 
library(dplyr)

# preparing the shapefile
nc <- st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) %>% 
  select(AREA, PERIMETER) %>% 
  mutate(AREA = as.factor(AREA<median(AREA)))

如果我独立绘制每个字段:

plot(nc[,1])

plot(nc[,2])

两张图片都很好,有图例等等,但我希望它们都在同一个面板上。 sf::plot 提供此功能,如 https://r-spatial.github.io/sf/articles/sf5.html#geometry-with-attributes-sf 中所述:

plot(nc)

我失去了传说,它们彼此重叠,而不是并排。在?plot 你可以阅读:

要对单个地图进行更多控制,请将参数 mfrow 设置为 par 在绘制之前,一张一张地绘制单个地图。

但是当我这样做时,它不起作用:

par(mfrow=c(1,2))
plot(nc[,1])
plot(nc[,2])
par(mfrow=c(1,1))

知道如何用sf 并排绘制两张地图吗?

【问题讨论】:

    标签: r plot sf


    【解决方案1】:

    最后,这是文档中的一个问题。为了能够将parsf::plot 一起使用,您需要执行以下任一操作:

    par(mfrow=c(1,2))
    plot(st_geometry(nc[,1]))
    plot(st_geometry(nc[,2]))
    par(mfrow=c(1,1))
    

    par(mfrow=c(1,2))
     plot(nc[,1], key.pos = NULL, reset = FALSE)
     plot(nc[,2], key.pos = NULL, reset = FALSE)
    par(mfrow=c(1,1))
    

    但是,您在第一种情况下会丢失颜色,在两种情况下都会丢失图例。您必须自己手动管理。

    见:https://github.com/r-spatial/sf/issues/877

    【讨论】:

      【解决方案2】:

      我没有在 sf 包中找到解决方案。我发现这可能适合你

      library(ggplot2)
      area<-ggplot() + geom_sf(data = nc[,1], aes(fill = AREA))
      perim<-ggplot() + geom_sf(data = nc[,2], aes(fill = PERIMETER))
      gridExtra::grid.arrange(area,perim,nrow=1)
      

      【讨论】:

      • 是的,我也使用ggplot 进行了调查。但是,在我的具体情况下,我有超过 134,000 个点要绘制,并且出于我忽略的原因,使用 ggplot 绘制它们非常慢/不可能,而基本的 plot 函数很好。我可能会进一步研究 ggplot 选项,看看我是否可以让它工作。
      【解决方案3】:

      要添加到@Bastien 的答案,您可以手动添加图例。这是一个简单的函数,它将使用 leafletplotrix 库添加一个连续的图例:

      addLegendToSFPlot <- function(values = c(0, 1), labels = c("Low", "High"), 
                                    palette = c("blue", "red"), ...){
      
          # Get the axis limits and calculate size
          axisLimits <- par()$usr
          xLength <- axisLimits[2] - axisLimits[1]
          yLength <- axisLimits[4] - axisLimits[3]
      
          # Define the colour palette
          colourPalette <- leaflet::colorNumeric(palette, range(values))
      
          # Add the legend
          plotrix::color.legend(xl=axisLimits[2] - 0.1*xLength, xr=axisLimits[2],
                                yb=axisLimits[3], yt=axisLimits[3] + 0.1 * yLength,
                                legend = labels, rect.col = colourPalette(values), 
                                gradient="y", ...)
      }
      

      将上述函数与@Bastien 的代码一起使用:

      # Load required libraries
      library(sf) # Working spatial data
      library(dplyr) # Processing data
      library(leaflet) # Has neat colour palette function
      library(plotrix) # Adding sf like legend to plot
      
      # Get and set plotting window dimensions
      mfrowCurrent <- par()$mfrow
      par(mfrow=c(1,2))
      
      # Add sf plot with legend
      plot(nc[,1], key.pos = NULL, reset = FALSE)
      addLegendToSFPlot(values = c(0, 1), 
                        labels = c("False", "True"),
                        palette = c("lightseagreen", "orange"))
      
      # Add sf plot with legend
      plot(nc[,2], key.pos = NULL, reset = FALSE)
      valueRange <- range(nc[, 2, drop = TRUE])
      addLegendToSFPlot(values = seq(from = valueRange[1], to = valueRange[2], length.out = 5), 
                        labels = c("Low", "", "Medium", "", "High"),
                        palette = c("blue", "purple", "red", "yellow"))
      
      # Reset plotting window dimensions
      par(mfrow=mfrowCurrent)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        相关资源
        最近更新 更多