Слияние стран / провинций в шейп-файле для построения графиков с помощью ggplot2 - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь нанести на карту некоторые провинциальные данные о Канаде.Однако некоторые из моих данных объединены в регионы, поэтому мне нужно объединить некоторые провинции на моей карте.Я знаю, что провинции в моих данных пересекаются с некоторыми регионами (Альберта является частью прерий), но это то, что у меня есть.

Пример данных, которые я хочу построить:

data_to_plot <- data.frame(province = c("Alberta", "Atlantic Canada", "British Columbia", 
                                        "Ontario", "Prairies", "Quebec"),
                           data = runif(6, 1E6, 1E8))

Шейп-файл для Канады с провинциями можно скачать здесь .

Что я пробовал до сих пор:

library(tidyverse)
library(rgdal)

# Import the shape file
shapefile <- readOGR("[path to shape file]", "Canada")
shapefile_df <- fortify(shapefile, region = "NAME")
shapefile_df$id[shapefile_df$id == "Yukon Territory"] <- "Yukon"

# Replace `id` with new region name, where applicable
shapefile_df <- shapefile_df %>%
  mutate(id = case_when(id %in% c("New Brunswick", "Nova Scotia", "Prince Edward Island") ~ "Atlantic Canada",
                        id %in% c("Saskatchewan", "Manitoba") ~ "Prairies",
                        TRUE ~ id))

# Merge map data with data to plot
map.data <- full_join(shapefile_df, data_to_plot, by = c("id" = "province"))

# Plot the map
ggplot(map.data) +
  geom_polygon(aes(x = long, y = lat, group = id, fill = data),
               size = 0, alpha = 0.9) +
  geom_path(aes(x = long, y = lat, group = group),
            color = "grey", size = 0.5, alpha = 0.5)

Как вы можете видеть ниже, это создает беспорядок,Желательно также удалить любые границы между провинциями в пределах одного региона.Я признаю, что не знаю много о файлах форм или ГИС, поэтому, пожалуйста, дайте мне знать, если то, что я хочу сделать, невозможно.

example_plot

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Я знаю, что этот вопрос старый, но для полноты ... Второе предложение Камиллы использовать sf. Это то, что вы ищете?

library(sf)
library(dplyr)
library(ggplot2)

data_to_plot <- data.frame(
    province=c("Alberta", "Atlantic Canada", "British Columbia", "Ontario", "Prairies", "Quebec"),
    data=runif(6, 1E6, 1E8)
)
shapefile <- st_read('/temp/r/Canada/Canada.shp')
shapefile$NAME <- as.character(shapefile$NAME)
shapefile$NAME[shapefile$NAME == "Yukon Territory"] <- "Yukon"

# Replace `id` with new region name, where applicable
shapefile <- shapefile %>%
  mutate(NAME = case_when(NAME %in% c("New Brunswick", "Nova Scotia", "Prince Edward Island") ~ "Atlantic Canada",
                        NAME %in% c("Saskatchewan", "Manitoba") ~ "Prairies",
                        TRUE ~ NAME))

# Merge map data with data to plot
map.data <- full_join(shapefile, data_to_plot, by = c("NAME"="province"))

ggplot() +
    geom_sf(data=map.data, aes(fill=data))

enter image description here

0 голосов
/ 16 марта 2019

Для правильной работы кадра данных, созданного с помощью fortify, строки должны быть в том порядке, в котором они были при создании, иначе вы получите тот странный эффект, который вы видите в Северной Канаде.Мне нравится добавлять идентификатор строки в укрепленный объект, если я собираюсь делать какие-либо слияния и соединения с ним.Итак:

shapefile <- readOGR("[path to shape file]", "Canada")
shapefile_df <- fortify(shapefile, region = "NAME")
shapefile_df$row_id <- 1:nrow(shapefile_df)

Затем переименуйте переменные и сделайте соединения, и т. Д., И прежде чем строить это, сделайте:

shapfile_df <- shapefile_df %>% arrange(row_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...