在美国地图50个州绘制纬度/经度数据点,包括阿拉斯加州和阿拉斯加州。夏威夷

时间:2018-03-27 22:26:45

标签: r ggplot2

我试图在美国所有50个州与阿拉斯加州和夏威夷州重新安置的情节中创建一个类似于这个气泡图的气泡图。

数据集将包含5个变量,邮政编码,纬度经度(从邮政编码包合并),金额和分数。数量和分数变量将由气泡的大小和颜色表示。

我一直试图用ggplot来做这件事。第一种方法使用maps包。但是,我不知道如何移动阿拉斯加和夏威夷并改装它,以及划出美国的边界。

这就是我得到的。

US <- map_data("world") %>% filter(region=="USA")


p <- ggplot() + 
  geom_polygon(data = US, aes(x=long, y = lat, group = group), fill="grey", alpha=0.3) +
  geom_point(data = df, alpha = 0.5, aes(x=df$lon, y=df$lat, size=df$manual_prm, color=df$wcng_score)) +
  scale_size_continuous(name="Premium", trans="log",  range=c(0.1,4)) +
  scale_alpha_continuous(range=c(0.1, 0.9)) +
  scale_color_viridis(name = "Scores", trans="log", option="magma") +
  theme_void() + 
  coord_map() +
  ggtitle("Scores") +
  theme(
    legend.position = c(0.85, 0.8),
    text = element_text(color = "#22211d"),
    plot.background = element_rect(fill = "#f5f5f2", color = NA), 
    panel.background = element_rect(fill = "#f5f5f2", color = NA), 
    legend.background = element_rect(fill = "#f5f5f2", color = NA),
    plot.title = element_text(size= 16, hjust=0.1, color = "#4e4d47", margin = margin(b = -0.1, t = 0.4, l = 2, unit = "cm"))
  )

另一种方法涉及使用albersusa包。但是,我得到了几乎相同的问题。这个版本也使边界不可见。

结果如下。

我遗漏了秤。

library(tidyverse)
library(albersusa)
library(broom)


USA <- usa_composite(proj="laea")  # creates map projection 
USA_MAP <- tidy(USA, region="name")

q <- ggplot() + 
  geom_map(data = USA_MAP, map = USA_MAP, aes(map_id = id), fill=NA, size = 0.1)+
  geom_point(data = df, alpha = 0.5, aes(x=df$lon, y=df$lat, size=df$manual_prm, color=df$wcng_score)) +
  theme_void() +
  coord_map()

我怎样才能得到类似于情节产生的东西?

3 个答案:

答案 0 :(得分:1)

我会跟进neilfws建议使用五十年代。不幸的是我没有你的df对象所以不能建议如何最好地匹配大小,alpha和颜色。然而,plot.ly地图看起来是在美国阿尔伯斯等面积投影,所以我也提供了代码,以使投影看起来更好。这需要使用sf转换坐标并在ggplot中使用coord_sf而不是coord_map。

library(fiftystater)
library(sf)

epsg <- 102003
US <- st_as_sf(fifty_states, coords =c("long", "lat"), crs = 4326) %>%
  st_transform(epsg) %>%
  cbind(st_coordinates(.))

p <- ggplot() + 
  geom_polygon(data = US, aes(x=X, y = Y, group = group), fill="grey", alpha=0.3) +
  geom_point(data = df, alpha = 0.5, aes(x=df$lon, y=df$lat, size=df$manual_prm, color=df$wcng_score)) +
  scale_size_continuous(name="Premium", trans="log",  range=c(0.1,4)) +
  scale_alpha_continuous(range=c(0.1, 0.9)) +
  scale_color_viridis(name = "Scores", trans="log", option="magma") +
  theme_void() +
  coord_sf(crs = epsg, datum = NA) +
  ggtitle("Scores") +
  theme(
    legend.position = c(0.85, 0.8),
    text = element_text(color = "#22211d"),
    plot.background = element_rect(fill = "#f5f5f2", color = NA), 
    panel.background = element_rect(fill = "#f5f5f2", color = NA), 
    legend.background = element_rect(fill = "#f5f5f2", color = NA),
    plot.title = element_text(size= 16, hjust=0.1, color = "#4e4d47", margin = margin(b = -0.1, t = 0.4, l = 2, unit = "cm"))
  )

enter image description here

答案 1 :(得分:1)

我现在能够解决这个问题。问题是我在阿拉斯加和夏威夷的协调员处于原始位置。我所做的是将我的数据转换为空间数据点,并使用albersusa包中的points_elided将我的坐标转换为移动的阿拉斯加和夏威夷地图的正确位置。

我添加了以下代码

library(albersusa)
library(sp)
library(raster)
library(ggplot2)
library(bloom)

# set up reference coordinate system and convert to spatial points
coordinates(df) <- ~lon + lat
latlong = "init=epsg:4326"
proj4string(df) = CRS(latlong)
df <- as.data.frame(points_elided(df))


USA <- usa_composite(proj="laea")  # creates map projection 
USA_MAP <- tidy(USA, region="name")

q <- ggplot() + 
  geom_map(data = USA_MAP, map = USA_MAP, aes(map_id = id), fill=NA, size = 0.1)+
  geom_point(data = df, alpha = 0.5, aes(x=df$lon, y=df$lat, size=df$manual_prm, color=df$wcng_score)) +
  theme_void() +
  coord_map()

答案 2 :(得分:0)

尝试安装fiftystater包,如in this vignette所述。

您似乎了解ggplot的方式,所以我认为您可以调整该插图中第一个示例的代码。