2016-09-09 8 views
2

Я хотел бы построить только внешние границы переменной ethnic в this data set. Набор данных plot_data, который вы найдете по этой ссылке, представляет собой укрепленный набор данных из шейп-файла от PRIO GRID для Судана.Участок только внешней границы в ggplot2 map/geom_polygon

Мой текущий код выглядит следующим образом:

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() 

Это дает мне следующий вывод:

enter image description here

Однако, я хотел бы, чтобы удалить все внутренние линии в области урегулирования указанной этнической группы, и изображать только внешнюю границу района.

У меня не получилось найти решение для this similar problem для работы.

Возможно, мне понадобится объединить ячейки до Укреплять шейп-файл; но, возможно, есть способ после укрепления. Я попытался удалить дубликаты координат, но это не сработало. Любые предложения будут ценны. Благодарю.

ответ

2

Основная идея проста: вам нужно сопоставить заливку и цвет эстетике всего сюжета, а затем просто сопоставить цвет с эстетикой меньшего многоугольника, таким образом вы можете окрасить более мелкий многоугольник того же цвета, что и более крупного многоугольника. Это то, что избавляет от внутренних линий меньшего полигона. Затем я добавил размер за пределами эстетики меньшего многоугольника, чтобы увеличить ширину красной линии до ощутимого уровня.

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() 

enter image description here

Моя сессия информация:

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 

UPDATE: ОР оказывает утруждая производит тот же сюжет, используя код, который я отправил. У меня был мой друг, который воспроизводит сюжет в системе Windows (я на Эль Капитане), используя тот же код, который я поставил здесь, и он получил те же результаты (ниже).

enter image description here

+0

Спасибо! Но это не работает для меня; результат, который я получаю, следующий: http://imgur.com/a/DswP0. Я использую dplyr v0.5 и ggplot2 v2.1.0. Может быть, это помогло бы, если бы вы могли немного разобраться в своем процессе мышления за кодом. – Felix

+0

@ Феликс, не уверенный, что сказать. Я бы предложил очистить рабочее пространство и повторить попытку. Я использовал предоставленные вами данные и запускал код через RStudio и R, и я также запускал его на своей рабочей станции и labtops (оба mac) - все отлично работает. Возможно, в вашей среде есть расширение ggplot2 или тема, поэтому проверьте это также. Основная идея проста: вам нужно сопоставить заливку и цвет с эстетикой всего сюжета, а затем просто сопоставить цвет с эстетикой меньшего многоугольника, таким образом вы можете окрасить меньший многоугольник с тем же цветом, что и у большего polygon ... –

+0

... это то, что избавляется от внутренних линий меньшего многоугольника. Затем я добавил размер за пределами эстетики меньшего многоугольника, чтобы увеличить ширину красной линии до ощутимого уровня. –