创建一个具有适应大小的州的地图
create a map with the adapted size of states
你好可视化爱好者,
我正在尝试创建一个彩色地图图,就像这样:
(来源:https://github.com/hrbrmstr/albersusa)
BUT 我希望此地图有偏差,以便各州的面积与我提供的值成正比(特别是,我使用 GPD 值)。
我的意思是我希望一些州看起来比现实中的大一些,一些小一些但尽可能提醒真实的美国地图。
状态移动或形状破坏没有问题。
有什么想法吗?有现成的解决方案吗?
目前我使用 R 和 albersusa 包,因为它是我熟悉的东西。打开改变!
我当前的情节代码是:
gmap<-
ggplot() +
geom_map(data = counties@data, map = cmap,
aes(fill =atan(y/x),alpha=x+y, map_id = name),
color = "gray50") +
geom_map(data = smap, map = smap,
aes(x = long, y = lat, map_id = id),
color = "black", size = .5, fill = NA) +
theme_map(base_size = 12) +
theme(plot.title=element_text(size = 16, face="bold",margin=margin(b=10))) +
theme(plot.subtitle=element_text(size = 14, margin=margin(b=-20))) +
theme(plot.caption=element_text(size = 9, margin=margin(t=-15),hjust=0)) +
scale_fill_viridis()+guides(alpha=F,fill=F)
这是一个非常丑陋的第一次尝试,使用 maps
包中的大纲和 dplyr
中的一些数据操作。
library(maps)
library(dplyr)
library(ggplot2)
# Generate the base outlines
mapbase <- map_data("state.vbm")
# Load the centroids
data(state.vbm.center)
# Coerce the list to a dataframe, then add in state names
# Then generate some random value (or your variable of interest, like population)
# Then rescale that value to the range 0.25 to 0.95
df <- state.vbm.center %>% as.data.frame() %>%
mutate(region = unique(mapbase$region),
somevalue = rnorm(50),
scaling = scales::rescale(somevalue, to = c(0.25, 0.95)))
df
# Join your centers and data to the full state outlines
df2 <- df %>%
full_join(mapbase)
df2
# Within each state, scale the long and lat points to be closer
# to the centroid by the scaling factor
df3 <- df2 %>%
group_by(region) %>%
mutate(longscale = scaling*(long - x) + x,
latscale = scaling*(lat - y) + y)
df3
# Plot both the outlines for reference and the rescaled polygons
ggplot(df3, aes(long, lat, group = region, fill = somevalue)) +
geom_path() +
geom_polygon(aes(longscale, latscale)) +
coord_fixed() +
theme_void() +
scale_fill_viridis()
这些轮廓不是最好的,它们收缩的质心位置导致多边形有时会与原始状态轮廓重叠。但这是一个开始;您可以为美国各州和各种质心算法找到更好的形状。
你好可视化爱好者,
我正在尝试创建一个彩色地图图,就像这样:
BUT 我希望此地图有偏差,以便各州的面积与我提供的值成正比(特别是,我使用 GPD 值)。 我的意思是我希望一些州看起来比现实中的大一些,一些小一些但尽可能提醒真实的美国地图。 状态移动或形状破坏没有问题。
有什么想法吗?有现成的解决方案吗? 目前我使用 R 和 albersusa 包,因为它是我熟悉的东西。打开改变! 我当前的情节代码是:
gmap<-
ggplot() +
geom_map(data = counties@data, map = cmap,
aes(fill =atan(y/x),alpha=x+y, map_id = name),
color = "gray50") +
geom_map(data = smap, map = smap,
aes(x = long, y = lat, map_id = id),
color = "black", size = .5, fill = NA) +
theme_map(base_size = 12) +
theme(plot.title=element_text(size = 16, face="bold",margin=margin(b=10))) +
theme(plot.subtitle=element_text(size = 14, margin=margin(b=-20))) +
theme(plot.caption=element_text(size = 9, margin=margin(t=-15),hjust=0)) +
scale_fill_viridis()+guides(alpha=F,fill=F)
这是一个非常丑陋的第一次尝试,使用 maps
包中的大纲和 dplyr
中的一些数据操作。
library(maps)
library(dplyr)
library(ggplot2)
# Generate the base outlines
mapbase <- map_data("state.vbm")
# Load the centroids
data(state.vbm.center)
# Coerce the list to a dataframe, then add in state names
# Then generate some random value (or your variable of interest, like population)
# Then rescale that value to the range 0.25 to 0.95
df <- state.vbm.center %>% as.data.frame() %>%
mutate(region = unique(mapbase$region),
somevalue = rnorm(50),
scaling = scales::rescale(somevalue, to = c(0.25, 0.95)))
df
# Join your centers and data to the full state outlines
df2 <- df %>%
full_join(mapbase)
df2
# Within each state, scale the long and lat points to be closer
# to the centroid by the scaling factor
df3 <- df2 %>%
group_by(region) %>%
mutate(longscale = scaling*(long - x) + x,
latscale = scaling*(lat - y) + y)
df3
# Plot both the outlines for reference and the rescaled polygons
ggplot(df3, aes(long, lat, group = region, fill = somevalue)) +
geom_path() +
geom_polygon(aes(longscale, latscale)) +
coord_fixed() +
theme_void() +
scale_fill_viridis()
这些轮廓不是最好的,它们收缩的质心位置导致多边形有时会与原始状态轮廓重叠。但这是一个开始;您可以为美国各州和各种质心算法找到更好的形状。