【问题标题】:What is the easiest way to get the default R sf map plot default legend back?恢复默认的 R sf map plot 默认图例的最简单方法是什么?
【发布时间】:2020-01-18 06:05:03
【问题描述】:

我一直在尝试在等值线图上显示图例,但发现图例的 R 文档有点难以理解。已经读了几个小时了。

我看到下面有一个图例:

library(rnaturalearth)
world <- rnaturalearth::ne_countries(scale='medium',returnclass = 'sf')
class(world)
plot(world[,"adm0_dif"])

但以下不是:

plot(world[,"adm0_dif"], col=sf.colors(n = nrow(world), alpha=0.5))

在plot for sf object 的 R 帮助时代中,它声明:

“指定 col 禁止绘制图例键。”

所以,我想知道如果这就是我想要的,那么恢复默认图例的最简单方法是什么。

【问题讨论】:

    标签: r plot sf


    【解决方案1】:

    我使用 ggplot 比使用 base R plot 多,所以我不知道如何用 base R 添加图例。此外,我不熟悉 rnaturalearth 包和数据,所以我所做的只是复制你的情节使用 ggplot 并添加一个图例。我不确定这是否是您想要的图例,但我所做的只是用 ggplot 制作完全相同的图并添加了图例。如果它不是您想要的,您可以自定义图例。

    library(ggplot2)
    
    ggplot(data = world) +
      geom_sf(aes(fill = 1:nrow(world))) +
      scale_fill_viridis_c(name = "", alpha = 0.5, option = "plasma", trans = "sqrt") +
      theme_classic()
    

    对于多个变量的并排图,我们可以使用gridExtra 包。

    library(gridExtra)
    
    plot1 <-  ggplot(data = world) +
      geom_sf(aes(fill = 1:nrow(world))) +
      scale_fill_viridis_c(name = "", alpha = 1, option = "plasma", trans = "sqrt") +
      ggtitle("adm0_dif")+
      theme(plot.title = element_text(hjust = 0.5),
            panel.background = element_rect(fill = "white", colour = "white"))
    
    plot2 <-  ggplot(data = world) +
        geom_sf(aes(fill = labelrank)) +
        scale_fill_viridis_c(name = "", alpha = 1, option = "plasma", trans = "sqrt") +
        ggtitle("labelrank") +
        theme(plot.title = element_text(hjust = 0.5),
              panel.background = element_rect(fill = "white", colour = "white"))
    
    grid.arrange(plot1, plot2, ncol=2)
    
    

    对于未按数字编码的变量,如featurecla,请改用scale_fill_manual

    plot_fea <-  ggplot(data = world) +
      geom_sf(aes(fill = featurecla), show.legend = F) +
      scale_fill_manual(name = "", values = c("mediumaquamarine"))+
      ggtitle("featurecla") +
      theme(plot.title = element_text(hjust = 0.5),
            panel.background = element_rect(fill = "white", colour = "white"))
    
    plot_fea
    

    注意我只为scale_fill_manual 中的值提供了值(“mediumaquamarine”),因为它只包含一个唯一变量。传递给 value 的颜色数量必须与列中唯一变量的数量相匹配。

    【讨论】:

    • 我真正追求的是多网格/多面图。就像在一个 sf 数据帧上同时绘制多个变量一样。这很容易使用基础plot。也许你知道如何在ggplot 中做同样的事情?以下命令生成多图:plot(world)
    • 您可以在 ggplot 中获得相同的图,但这需要使用 gridExtra 包来获得并排的图。我无法将该代码放在评论中,因为它有点长,所以我建议您再问一个问题,因为您想要的与您在此处提出的不同。
    • 你用 plot(world) 得到的情节是怎么回事?您是否尝试绘制除 9 之外的特定变量?如果是这样,为什么不只是对数据框进行子集化并绘制呢?您在寻找额外的东西吗?
    • plot(world) 没有图例。
    • 再说一次,我不熟悉这些数据,但世界上的某些列很难有一个图例,尤其是有 9 个并排的图。例如,admin 列有 241 个国家的离散名称,这需要带有国家名称的图例。我可以为您提供一个并排的图表,其中包含分组的变量,然后为每个单独的图表提供一个图例。我可以用一个例子来编辑我的答案,然后你可以添加你想要的任何具体的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-04-28
    • 2010-09-25
    • 2014-10-24
    • 2018-09-27
    • 2019-02-17
    • 2011-01-19
    • 2021-03-30
    • 2015-05-20
    相关资源
    最近更新 更多