Построение границ штата и графства на одной карте с помощью plot_usmap из пакета usmap в R - PullRequest
0 голосов
/ 22 января 2020

Я хотел бы создать карту США, показывающую границы штатов и округов (т.е. границы штатов в другом цвете). Обычно я делаю это, используя либо импортируемые мной файлы форм, либо используя функцию ggplot2 map_data. Однако я сталкиваюсь с тремя препятствиями.

1) Я не могу установить gdal и geos в своей вычислительной среде, что исключает использование любых файлов фигур или файлов Geo JSON (мои попытки отобразить файлы форм на уровне округов, загруженные с использованием fastshp не увенчались успехом, но я открыт для любого решения, которое может воспроизвести карту ниже, но с учетом границ штатов).

2) Мне нужно включить Гавайи и Аляску, что исключает использование map_data с ggplot2.

3) Мне нужно, чтобы карта включала границы штата и округа, что делает использование usmap пакета проблематичным c в качестве функции-оболочки для ggplot2, но без простоты и общей способности настроить до уровня необработанного объекта ggplot2.

4) Кроме того, нельзя использовать sf пакет b c он имеет зависимость не от библиотеки R (пакет units зависит от библиотеки C libudunits2).

Что мне нужно: карта, которая может проецировать Аляску и Гавайи и отображать границы штатов и округов, используя контрастные цвета, и мне нужно выполнить sh все это, не прибегая к пакетам, которые полагаются на rgeos, rgdal и / или units.

То, что я до сих пор пробовал plot_usmap из пакета usmap:

library(dplyr)
library(stringr)
library(ggplot2)
library(usmap)
library(mapproj)
devtools::install_github("wmurphyrd/fiftystater")
library(fiftystater)

county_data<-read.csv("https://www.ers.usda.gov/webdocs/DataFiles/48747/PovertyEstimates.csv?v=2529") %>% #
  filter(Area_name != "United States") %>%
  select(FIPStxt, Stabr, Area_name, PCTPOVALL_2017) %>%
  rename(fips = FIPStxt)
crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests)
state_map <- map_data("state")

plot_usmap(data = county_data, values = "PCTPOVALL_2017", color = "white") + 
  geom_map(data = crimes, aes(map_id = state), map = fifty_states, color= "red") + 
  geom_path(data = state_map, aes(x =long , y=lat), color= "red")+
  expand_limits(x = fifty_states$long, y = fifty_states$lat) +
  theme(legend.position = "none") +
  theme_map() #no go

plot_usmap(data = county_data, values = "PCTPOVALL_2017", color = "white") + 
  geom_map(data = crimes, aes(map_id = state), map = fifty_states, color= "red") + 
  expand_limits(x = fifty_states$long, y = fifty_states$lat) +
  theme(legend.position = "none") +
  theme_map() #no go

plot_usmap(data = county_data, values = "PCTPOVALL_2017", color = "white") + 
  geom_map(data = crimes, aes(map_id = state, color= "red"), map = fifty_states) + 
  expand_limits(x = fifty_states$long, y = fifty_states$lat) +
  theme(legend.position = "none") +
  theme_map() #no go

Что я подозреваю происходит то, что один слой (исходный код ggplot) проецируется с использованием системы CRS, отличной от другого уровня, сгенерированного plot_usmap. Этот второй слой приводит к очень маленькой красной точке (см. Круг на карте ниже). Не уверен, как перепроектировать без установленного geos / gdal. См. Карту ниже с черным кружком, выделяющим красную точку.

enter image description here

1 Ответ

1 голос
/ 06 февраля 2020

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

Этот подход идеален для людей, желающих создать карту США с Аляской и На Гавайях было указано, кто ...

1) У вас нет возможности устанавливать пакеты не-R в среде, в которой работает движок R (например, отсутствует доступ администратора)

2 ) Необходимо отобразить границы округов и штатов, используя контрастные цвета

library(dplyr)
library(ggplot2)
library(usmap)

#Example data (poverty rates)
county_data<-read.csv("https://www.ers.usda.gov/webdocs/DataFiles/48747/PovertyEstimates.csv?v=2529") %>% #
  filter(Area_name != "United States") %>%
  select(FIPStxt, Stabr, Area_name, PCTPOVALL_2018) %>%
  rename(fips = FIPStxt)

states <- plot_usmap("states", 
                     color = "red",
                     fill = alpha(0.01)) #this parameter is necessary to get counties to show on top of states
counties <- plot_usmap(data = county_data, 
                       values = "PCTPOVALL_2018",
                       color = "black",
                       size = 0.1)

Используя метаинформацию слоев, уже встроенную в данные из us_map

ggplot() +
  counties$layers[[1]] + #counties needs to be on top of states for this to work
  states$layers[[1]] +
  counties$theme + 
  coord_equal() +
  theme(legend.position="none") +
  scale_fill_gradient(low='white', high='grey20') #toggle fill schema using vanilla ggplot scale_fill function

Используя только необработанные данные, полученные из пакета us_map

ggplot() +  
  geom_polygon(data=counties[[1]], 
               aes(x=x, 
                   y=y, 
                   group=group, 
                   fill = counties[[1]]$PCTPOVALL_2018), 
               color = "black",
               size = 0.1) +  
  geom_polygon(data=states[[1]], 
               aes(x=x, 
                   y=y, 
                   group=group), 
               color = "red", 
               fill = alpha(0.01)) + 
  coord_equal() +
  theme_map() +
  theme(legend.position="none") +
  scale_fill_gradient(low='white', high='grey20')

enter image description here

...