Добавьте точки в 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, которая показывает это более подробно.