2017-10-21 29 views
3

Je suis encore en train d'apprendre sur R et je veux cartographier les États des États-Unis avec les étiquettes du nombre de crimes survenus dans chaque État. Je veux créer l'image ci-dessous.Comment cartographier tous les états des États-Unis en utilisant R avec le nombre de crimes survenus dans chaque état?

J'ai utilisé le code ci-dessous qui était disponible en ligne mais je ne pouvais pas étiqueter le numéro de crimes.

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()) 

Quelqu'un peut-il m'aider?

Répondre

1

Pour ajouter du texte à un tracé (carte dans ce cas), il faut l'étiquette de texte et les coordonnées du texte. Voici une approche avec vos données:

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

Ici, j'utilisé le numéro d'assaut comme étiquette et moyenne du maximum et minimum de coordonnées de latitude et à long terme de chaque Etat sous forme de coordonnées texte. Les coordonnées pourraient être meilleures pour certains états, on peut les ajouter à la main ou utiliser les coordonnées de la ville choisie.

EDIT: la question mise à jour:

Choisissez d'abord l'année et le type de crime et de regrouper les données

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

puis terrain:

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

Si l'on veut comparer toutes les années, je suggère de le faire sans tex t, car il sera très encombré:

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

On peut voir n'a pas beaucoup changé au cours des années.

je faire confiance à une intrigue plus informative est:

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

+0

Merci pour votre réponse. J'utilise l'ensemble de données de [link] (https://www.kaggle.com/murderaccountability/homicide-reports) donc le code ci-dessus ne fonctionne pas pour cet ensemble de données. Pouvez-vous suggérer comment je peux utiliser le code ci-dessus pour l'ensemble de données sur les homicides? –

+0

Qu'aimeriez-vous tracer à partir de l'ensemble de données? c'est beaucoup plus complexe que celui de OP. La somme du meurtre ou Manslaughter par état pour un an? Veuillez mettre à jour le PO avec la question. – missuse

+0

Merci beaucoup !!! C'était très utile ... Je pouvais produire le graphique que je voulais :) –