在 r 中使用 ggplot 向 usmap 添加点
Add points to usmap with ggplot in r
我可以用这个 tutorial 创建美国地图。当我试图向它添加额外的点时,无论我输入什么数据,它们最终都在南达科他州。
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")
这是一个 "interesting" 包,与博客 [=49=] 代码相比没有太多增值,基础 shapefile 是从中生成的(但包作者认为不适合归功于作者包 DESCRIPTION
中的博客 post,只是 README 末尾的补充)。
作者也认为不适合做的一件事是为除 choropleths 之外的任何东西提供支持。您的问题是地图在一个坐标系中,而您的点在另一个坐标系中。
如果您可以使用非 CRAN 包,albersusa
(在 usamap
作者制作 copypasta 包之前 有一段时间 提供必要的胶水:
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")),]
注意:如果您在 Alaska/Hawaii 中有积分,则需要在程序包中使用 'points_elided() 函数来修改任何阿拉斯加或夏威夷积分。一个长期的 TODO 是让 points_elided()
支持所有转换,但我几乎不需要在 choropleths 之外使用这个包,所以它会成为 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
以匹配 [=13= 使用的投影].
这是一个与您提供的数据类似的示例:
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 = x, y = y),
color = "red",
size = 3)
还有一个名为 Advanced Mapping 的新插图更详细地说明了这一点。
我可以用这个 tutorial 创建美国地图。当我试图向它添加额外的点时,无论我输入什么数据,它们最终都在南达科他州。
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")
这是一个 "interesting" 包,与博客 [=49=] 代码相比没有太多增值,基础 shapefile 是从中生成的(但包作者认为不适合归功于作者包 DESCRIPTION
中的博客 post,只是 README 末尾的补充)。
作者也认为不适合做的一件事是为除 choropleths 之外的任何东西提供支持。您的问题是地图在一个坐标系中,而您的点在另一个坐标系中。
如果您可以使用非 CRAN 包,albersusa
(在 usamap
作者制作 copypasta 包之前 有一段时间 提供必要的胶水:
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")),]
注意:如果您在 Alaska/Hawaii 中有积分,则需要在程序包中使用 'points_elided() 函数来修改任何阿拉斯加或夏威夷积分。一个长期的 TODO 是让 points_elided()
支持所有转换,但我几乎不需要在 choropleths 之外使用这个包,所以它会成为 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
以匹配 [=13= 使用的投影].
这是一个与您提供的数据类似的示例:
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 = x, y = y),
color = "red",
size = 3)
还有一个名为 Advanced Mapping 的新插图更详细地说明了这一点。