Постройте шейп-файл с помощью ggplot2 - PullRequest
0 голосов
/ 17 июня 2020

Я хочу создать фасет с девятью (в этом примере только тремя) картами на одном графике. Мне удалось построить почти идеально одну карту, когда я subset из оригинала shapefile. Однако когда я пытаюсь построить их все сразу, это невозможно.

Сюжет должен иметь одинаковую легенду (дискретные числа в качестве значений 1, 2, 3, 4, 5), даже если некоторые карты имеют только значения из 1 на 4.

Кроме того, когда для одного из полигонов отсутствуют данные, он должен быть отображен серым цветом с легендой NA value.

Пример вывода из приведенного ниже кода находится на дно. Пример данных доступен , здесь .

path <- '~path'
muniCluster <- rgdal::readOGR(dsn=path, layer="data")

class(muniCluster)
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"


ilum <- subset(muniCluster, CLUSTER == "CLUS_ILUM")
ilum$VALUES <- as.integer(ilum$VALUES)

ilum_df <- fortify(ilum)
ilum_tidy <- tidy(ilum)

class(ilum_df)
class(ilum_tidy)

# Recategorizes data as required for plotting
ilum$id <- row.names(ilum)
ilum_tidy <- left_join(ilum_tidy, ilum@data)
ilum_tidy$VALUES <- as.factor(ilum_tidy$VALUES)

ilum_map_v2 <- ggplot(ilum_tidy, aes(x = long, y = lat, group = group, fill = VALUES)) +
     geom_polygon(color = "black", size = 0.1) +
     labs(title = "Light cluster") +
     scale_fill_viridis(discrete=TRUE) 

ilum_map_final_v2 <- ilum_map_v2 + coord_map() 

print(ilum_map_final_v2)

enter image description here

1 Ответ

1 голос
/ 18 июня 2020

В настоящее время, вероятно, проще использовать пакет sf для построения карт нужного вам типа. Здесь вы можете увидеть несколько примеров https://r-spatial.github.io/sf/articles/sf5.html

Я адаптировал пример оттуда, который показывает, как использовать ggplot2 и его функцию facet_wrap для создания карты для каждого уровня заданная переменная.

Некоторые шаги, показанные здесь, могут быть необязательными, если у вас уже есть, например, переменная с определенным количеством уровней, которые вы должны фасетить.

library(sf)
library(ggplot2)
library(tidyr)
library(dplyr)
library(classInt)
library(viridis)

# Read example shapefile from sf package
nc <- st_read(system.file("shape/nc.shp", package="sf"))

# subset columns of interest as well as geometry column
# create BIR in which the variables BIR74, BIR79, NWBIR79
# become different levels of it
nc2 <- nc %>% select(BIR74, BIR79, NWBIR79, geometry) %>% gather(VAR, BIR, -geometry)

# HEre i just wanted to create 5 categories for the BIR variable
ints <- classIntervals(nc2$BIR, n = 5, style = "jenks")
nc2 <- nc2 %>% mutate(BIR_cat = cut(BIR, ints$brks, dig.lab=10)) 

# I just changed the levels's labels to match the output you are looking for
nc2 <- nc2 %>% mutate(values = ifelse(BIR_cat == "(3,1946]", "1", 
                                ifelse(BIR_cat == "(1946,4706]", "2", 
                                 ifelse(BIR_cat == "(4706,9087]", "3",
                                  ifelse(BIR_cat == "(9087,16184]", "4",
                                    ifelse(BIR_cat == "(16184,30757]", "5", NA))))))

# Map the spatial data
ggplot() +
 geom_sf(data = nc2, aes(fill = values)) +
 facet_wrap(~VAR, ncol = 1) +
 scale_fill_viridis(discrete=TRUE) 

enter image description here

...