Добавьте точки в usmap с помощью ggplot в r

Я смог создать карту США с этим уроком. Когда я попытался добавить к этому дополнительные очки, все они оказались в Южной Дакоте, независимо от того, что я вводил для данных.

library(ggplot2)
library(usmap)
testData <- data.frame(LATITUDE = 20.31557, LONGITUDE = -102.42547)
p <- plot_usmap( regions = "state") 
p + geom_point(data = testData, aes(x = LONGITUDE, y = LATITUDE), color = "red")

1 ответ

Решение

Это "интересный" пакет, который не имеет большой добавленной стоимости по сравнению с кодом поста в блоге, из которого были созданы базовые шейп-файлы (однако автор пакета не счел нужным верить авторам поста в блоге в пакете DESCRIPTION, просто прикрепить к концу README).

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

Если вы можете использовать не-CRAN пакеты, albersusa (который был некоторое время до usamap автор сделал копию пакета) предоставляет необходимый клей:

library(albersusa) # https://gitlab.com/hrbrmstr/albersusa / https://github.com/hrbrmstr/albersusa
library(ggplot2)
library(sp)

Получите карту США предварительно спроектированной:

us <- usa_composite(proj = "aeqd")

Мы будем использовать встроенные данные "state.center", чтобы получить очки

states_centers <- as.data.frame(state.center)
states_centers$name <- state.name

Однако, если вы посмотрите справку на сайте state.center, вы увидите, что они не предоставляют законных координат для Аляски и Гавайев, мы не можем их использовать:

states_centers <- states_centers[!(states_centers$name %in% c("Alaska", "Hawaii")),]

ПРИМЕЧАНИЕ. Если у вас есть очки на Аляске / Гавайях, вам нужно выбрать функцию 'points_elided() в пакете, чтобы изменить любые точки Аляски или Гавайев. Давний TODO должен был сделать points_elided() поддерживать все преобразования, но мне почти никогда не нужно использовать пакет вне хороплетов, так что какое-то время это будет TODO.

Теперь сделайте их правильными координатами для нашей карты, перейдя от прямой long/lat к проецируемой системе координат:

coordinates(states_centers) <- ~x+y
proj4string(states_centers) <- CRS(us_longlat_proj)
states_centers <- spTransform(states_centers, CRSobj = CRS(us_aeqd_proj))
states_centers <- as.data.frame(coordinates(states_centers))

И, сюжет их:

us_map <- fortify(us, region="name")

ggplot() +
  geom_map(
    data = us_map, map = us_map,
    aes(x = long, y = lat, map_id = id),
    color = "#2b2b2b", size = 0.1, fill = NA
  ) +
  geom_point(
    data = states_centers, aes(x, y), size = 4, color = "steelblue"
  ) +
  coord_equal() + # the points are pre-projected
  ggthemes::theme_map()

Начиная с usmap 0.5.0, существует новая функция, которая называетсяusmap_transform который преобразует data.frame чтобы соответствовать проекции, используемой usmap.

Вот пример, аналогичный предоставленным вами данным:

library(usmap)
library(ggplot2)

# Lat/Lon of Sioux Falls, SD
test_data <- data.frame(lon = -96.70, lat = 43.55)

transformed_data <- usmap_transform(test_data)

plot_usmap("states") + 
  geom_point(data = transformed_data, 
             aes(x = lon.1, y = lat.1), 
             color = "red",
             size = 3)

https:https://stackru.com/images/dfdb9516632ac0428e66503ada3db3e9936876cf.png

Также есть новая виньетка под названием Advanced Mapping, которая показывает это более подробно.

Другие вопросы по тегам