【问题标题】:Plot only outer border in ggplot2 map / geom_polygon在 ggplot2 地图/geom_polygon 中仅绘制外边界
【发布时间】:2016-09-09 11:17:22
【问题描述】:

我只想在this data set 中绘制ethnic 变量的外边界。您在此链接下找到的数据集plot_data 是来自PRIO GRID 苏丹的 shapefile 的强化数据集。

我当前的代码如下所示:

plot_data <- load("plot_data.rdata")

ggplot(plot_data, 
       aes(x= long, 
           y = lat, 
           group = id)) + 
  geom_polygon() + 
  geom_polygon(data = plot_data %>% 
                 filter(!is.na(ethnic)) %>% # subset data with ethnicity only
                 as.data.frame(), 
               aes(color = ethnic)) + 
  coord_equal() 

这给了我以下输出:

但是,我想删除指定民族聚居区的所有内部线,只绘制该区域的外部边界。

我没有让this similar problem 工作的解决方案。

我可能需要合并单元格之前我强化 shapefile;但也许加固后有办法。我试图删除重复的坐标,但没有奏效。任何建议将不胜感激。谢谢。

【问题讨论】:

    标签: r ggplot2 maps gis spatial


    【解决方案1】:

    基本思想很简单:您需要将填充和颜色映射到整个绘图的美感,然后只需将颜色映射到较小多边形的美感,这样您就可以为较小的多边形着色与该颜色相同的颜色的更大的多边形。这就是摆脱较小多边形的内线的原因。然后我在较小多边形的美学之外添加了尺寸,以便将红线的宽度增加到可感知的水平。

    plot_data <- load("plot_data.rdata")   
    
    library(ggplot2) 
    
    df<-plot_data %>% 
      filter(!is.na(ethnic)) %>% # subset data with ethnicity only
      as.data.frame()    
    
    ggplot(plot_data, 
           aes(x= long, y = lat, group = id,fill="", color="")) + 
      geom_polygon() + 
      geom_polygon(data = df, 
                   aes(color = ethnic), size=1) + 
      geom_polygon(data=df, aes(x= long, y = lat, group = id))+
      scale_fill_manual(values="black", guide=F)+
      scale_color_manual(name="ethnic",
                   labels=c("","Shaygiyya, Ja'aliyyin and Danagla (Arab)"),
                   values=c("black","red"), 
                   breaks = c("NA","Shaygiyya, Ja'aliyyin and Danagla (Arab)")) +
      coord_equal()
    

    我的会话信息:

    sessionInfo()
    R version 3.3.1 (2016-06-21)
    Platform: x86_64-apple-darwin13.4.0 (64-bit)
    Running under: OS X 10.11.5 (El Capitan)
    
    locale:
    [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    
    loaded via a namespace (and not attached):
     [1] Rcpp_0.12.7        XML_3.98-1.4       proj4_1.0-8        bitops_1.0-6      
     [5] MASS_7.3-45        grid_3.3.1         plyr_1.8.3         gtable_0.2.0      
     [9] scales_0.4.0       KernSmooth_2.23-15 ggplot2_2.1.0      ash_1.0-15        
    [13] RColorBrewer_1.1-2 RJSONIO_1.3-0      tools_3.3.1        RSelenium_1.4.2   
    [17] munsell_0.4.3      RCurl_1.95-4.8     maps_3.1.0         colorspace_1.2-6  
    [21] caTools_1.17.1 
    

    更新: OP 在使用我发布的代码生成相同的情节时遇到了麻烦。我的一个朋友使用我在此处提供的相同代码在 Windows 系统(我在 El Capitan)上重现了该图,他得到了相同的结果(如下)。

    【讨论】:

    • 谢谢!但这对我来说不太适用;我得到的结果是:imgur.com/a/DswP0。我正在使用 dplyr v0.5 & ggplot2 v2.1.0。如果您能详细说明一下代码背后的思考过程,也许会有所帮助。
    • 谢谢,非常感谢您抽出宝贵的时间来帮助我。确实很奇怪。我可以完美地复制我自己的情节,但我仍然无法让您的代码正常工作(使用干净的环境等等)。您的解释非常有道理,因此问题确实可能与我的 R 安装有关。今晚我会在我的家用笔记本电脑上试一试;如果我可以复制您的代码,我会接受答案并打开一个新的。您使用的是哪个 ggplot 版本?
    • 所以我尝试在具有不同 dplyr 和 ggplot2 版本的家用笔记本电脑(也是 Windows 机器)上运行您的代码。结果还是和上面一样,即imgur.com/a/DswP0。我正在将代码发送给一些同事,看看他们得到了什么结果并报告。
    • 当我通过开罗设备或直接导出为 PDF 时,我设法获得了您发布的地图。我很确定这是我的 R 版本中的一个错误(您使用的是较新版本),而且我已经计划进行更新。所以这就是我要做的。再次感谢您花时间和精力帮助解决这个问题。
    • 我已接受您的回答并将您从 cmets 中的解释添加到答案中,因此您的代码背后的想法很明确。
    猜你喜欢
    • 2013-08-12
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多