R语言 是否可以使用某些shapefile压缩美国的县级Map,包括阿拉斯加和夏威夷?

bq3bfh9z  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(115)

我正在做一个项目,要求我绘制出美国所有50个州的所有县。到目前为止,我在绘制数据方面取得了部分成功。我遇到的问题是,在我的代码中,阿拉斯加和夏威夷使用我目前拥有的shapefile非常分散。
下面是我的代码:

df <- tigris::counties(state = NULL, cb = TRUE, class = 'sf')
# this step is to remove all of the polygons for US territories 
# since my data does not include it
df <- df %>% filter(!STATEFP %in% c('60', '66', '69', '72', '78'))
ggplot(df) + geom_sf()

它创建了这张照片:

正如你所看到的,阿拉斯加的尾端被绘制在图表的右侧,使我的整个Map伸展。是否有其他方法可以更好地绘制阿拉斯加和夏威夷,或者我应该考虑使用其他shapefile来使Map更加精简?

djp7away

djp7away1#

我是在Quentin Read's blog之后做的。我的代码如下:

df <- tigris::counties(state = NULL, cb = T, class = 'sf')

df <- df %>% filter(!STATEFP %in% c('60', '66', '69', '72', '78'))

crs_lambert <- "+proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs"

df <- df %>%
  st_transform(crs = crs_lambert)

alaska <- df %>% filter(STATE_NAME %in% 'Alaska')
alaska_g <- st_geometry(alaska)
alaska_centroid <- st_centroid(st_union(alaska_g))

rot <- function(a) matrix(c(cos(a), sin(a), -sin(a), cos(a)), 2, 2)

alaska_trans <- (alaska_g - alaska_centroid) * rot(-39 * pi/180) / 2.3 + alaska_centroid + c(1000000, -5000000)

alaska <- alaska %>% st_set_geometry(alaska_trans) %>% st_set_crs(st_crs(df))

hawaii <- df %>% filter(STATE_NAME %in% 'Hawaii')

hawaii_g <- st_geometry(hawaii)
hawaii_centroid <- st_centroid(st_union(hawaii_g))

hawaii_trans <- (hawaii_g - hawaii_centroid) * rot(-35 * pi/180) + hawaii_centroid + c(5200000, -1400000)
hawaii <- hawaii %>% st_set_geometry(hawaii_trans) %>% st_set_crs(st_crs(df))

tnc_map_final <- df %>%
  filter(!STATE_NAME %in% c('Alaska', 'Hawaii')) %>%
  rbind(alaska) %>%
  rbind(hawaii)

ggplot(tnc_map_final) + 
  geom_sf()

结果,我得到了下面的Map。

相关问题