如何使用R来映射美国所有州以及每个州发生的犯罪数量?

时间:2017-10-21 03:31:43

标签: r ggplot2

我还在学习R,我想用每个州发生的犯罪数量标签来映射美国各州。我想创建下面的图像。

我使用了以下可在线获得的代码,但我无法标明“罪名”。

    library(ggplot2)
    library(fiftystater)

    data("fifty_states") 
    crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests)
    p <- ggplot(crimes, aes(map_id = state)) + 
      # map points to the fifty_states shape data
      geom_map(aes(fill = Assault), map = fifty_states) + 
      expand_limits(x = fifty_states$long, y = fifty_states$lat) +
      coord_map() +


scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  labs(x = "", y = "") + theme(legend.position = "bottom", 
        panel.background = element_blank())

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:4)

要向绘图添加文本(在本例中为地图),需要文本标签和文本坐标。以下是您的数据方法:

library(ggplot2)
library(fiftystater)
library(tidyverse)

data("fifty_states") 

ggplot(data= crimes, aes(map_id = state)) + 
  geom_map(aes(fill = Assault),  color= "black", map = fifty_states) + 
  expand_limits(x = fifty_states$long, y = fifty_states$lat) +
  coord_map() +
  geom_text(data = fifty_states %>%
              group_by(id) %>%
              summarise(lat = mean(c(max(lat), min(lat))),
                        long = mean(c(max(long), min(long)))) %>%
              mutate(state = id) %>%
              left_join(crimes, by = "state"), aes(x = long, y = lat, label = Assault ))+
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  labs(x = "", y = "") + theme(legend.position = "bottom", 
                               panel.background = element_blank())

enter image description here

这里我使用攻击号作为标签,并将每个州的纬度和长度坐标的最大值和最小值的平均值用作文本坐标。对于某些州,坐标可能更好,可以手动添加或使用选定的城市坐标。

编辑:更新的问题:

首先选择犯罪年份和类型并汇总数据

homicide %>%
  filter(Year  == 1980 & Crime.Type == "Murder or Manslaughter") %>%
  group_by(State) %>%
  summarise(n = n()) %>%
  mutate(state = tolower(State)) -> homicide_1980

然后绘图:

ggplot(data = homicide_1980, aes(map_id = state)) + 
  geom_map(aes(fill = n),  color= "black", map = fifty_states) + 
  expand_limits(x = fifty_states$long, y = fifty_states$lat) +
  coord_map() +
  geom_text(data = fifty_states %>%
              group_by(id) %>%
              summarise(lat = mean(c(max(lat), min(lat))),
                        long = mean(c(max(long), min(long)))) %>%
              mutate(state = id) %>%
              left_join(homicide_1980, by = "state"), aes(x = long, y = lat, label = n))+
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  labs(x = "", y = "") + theme(legend.position = "bottom", 
                               panel.background = element_blank())

enter image description here

如果有人想要比较所有年份,我建议不用文字进行比较,因为它会非常混乱:

homicide %>%
  filter(Crime.Type == "Murder or Manslaughter") %>%
  group_by(State, Year) %>%
  summarise(n = n()) %>%
  mutate(state = tolower(State)) %>%
  ggplot(aes(map_id = state)) + 
  geom_map(aes(fill = n),  color= "black", map = fifty_states) + 
  expand_limits(x = fifty_states$long, y = fifty_states$lat) +
  coord_map() +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  labs(x = "", y = "") + theme(legend.position = "bottom", 
                               panel.background = element_blank())+
  facet_wrap(~Year, ncol = 5)

enter image description here

多年来,人们可以看到没有太大变化。

我相信一个更具信息性的情节是:

homocide %>%
  filter(Crime.Type == "Murder or Manslaughter") %>%
  group_by(State, Year) %>%
  summarise(n = n()) %>%
  mutate(state = tolower(State)) %>%
  ggplot()+
  geom_line(aes(x = Year, y = n))+
  facet_wrap(~state, ncol = 6, scales= "free_y")+
  theme_bw()

enter image description here