使用 R 中 usmap 包中的 plot_usmap 在同一张地图上绘制州和县边界
Plotting both state AND county boundaries on same map using plot_usmap from usmap package in R
我想创建一张美国地图,同时显示州和县的边界(即不同颜色的州边界)。我通常使用我导入的形状文件或使用 ggplot2
的 map_data
函数来执行此操作。但是,我面临三个障碍。
1) 我无法在我的计算环境中安装 gdal
和 geos
,因此无法使用任何形状文件或 GeoJSON 文件(我尝试映射使用 [= 加载的县级形状文件16=] 没有成功,但我愿意接受任何可以重现下面的地图但包括州边界的解决方案。
2) 我需要包括夏威夷和阿拉斯加,这样就排除了使用 ggplot2
中的 map_data
。
3) 我需要地图同时包括州和县的边界,这使得 usmap
包的使用存在问题,因为它是 ggplot2
的包装函数,但没有轻松和一般的能力自定义到原始 ggplot2 对象的级别。
4) 此外,不能使用 sf
包,因为它具有非 R 库依赖性(units
包依赖于 C 库 libudunits2
)。
我需要的是:一张可以投影阿拉斯加和夏威夷并使用对比色显示州和县边界的地图,我需要在不借助任何依赖 rgeos
、[=25 的软件包的情况下完成这一切=], and/or units
.
到目前为止,我从 usmap
包 plot_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
代码)使用与由 plot_usmap
生成的另一层不同的 CRS 系统进行投影。第二层产生一个非常小的红点(见下图中的圆圈)。不确定如何在未安装 geos/gdal 的情况下重新投影。请参阅下面的地图,黑色圆圈突出显示了红点所在的位置。
好的,在包作者的一些建议和我自己的一些修改之后,我终于能够得到我想要的输出。
这种方法非常适合希望生成包含阿拉斯加和夏威夷在内的美国地图的人...
1) Do not have the ability to install non-R packages in the
environment their R engine is running on (e.g. lack admin access)
2) Need to map both county and state boundaries using contrasting
colors
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')
我想创建一张美国地图,同时显示州和县的边界(即不同颜色的州边界)。我通常使用我导入的形状文件或使用 ggplot2
的 map_data
函数来执行此操作。但是,我面临三个障碍。
1) 我无法在我的计算环境中安装 gdal
和 geos
,因此无法使用任何形状文件或 GeoJSON 文件(我尝试映射使用 [= 加载的县级形状文件16=] 没有成功,但我愿意接受任何可以重现下面的地图但包括州边界的解决方案。
2) 我需要包括夏威夷和阿拉斯加,这样就排除了使用 ggplot2
中的 map_data
。
3) 我需要地图同时包括州和县的边界,这使得 usmap
包的使用存在问题,因为它是 ggplot2
的包装函数,但没有轻松和一般的能力自定义到原始 ggplot2 对象的级别。
4) 此外,不能使用 sf
包,因为它具有非 R 库依赖性(units
包依赖于 C 库 libudunits2
)。
我需要的是:一张可以投影阿拉斯加和夏威夷并使用对比色显示州和县边界的地图,我需要在不借助任何依赖 rgeos
、[=25 的软件包的情况下完成这一切=], and/or units
.
到目前为止,我从 usmap
包 plot_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
代码)使用与由 plot_usmap
生成的另一层不同的 CRS 系统进行投影。第二层产生一个非常小的红点(见下图中的圆圈)。不确定如何在未安装 geos/gdal 的情况下重新投影。请参阅下面的地图,黑色圆圈突出显示了红点所在的位置。
好的,在包作者的一些建议和我自己的一些修改之后,我终于能够得到我想要的输出。
这种方法非常适合希望生成包含阿拉斯加和夏威夷在内的美国地图的人...
1) Do not have the ability to install non-R packages in the environment their R engine is running on (e.g. lack admin access)
2) Need to map both county and state boundaries using contrasting colors
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')