2015-10-16 12 views
7

Creato a choropleth utilizzando ggplot2. Ecco il codice ggplotCombinazione di coropleth creato in ggplot e ggmap

okc <- ggplot() + 
    geom_polygon(data = mapdata, aes(x = long, y = lat, group = group, 
            fill = B19013_001), color = "black", size = 0.5)+ 
    scale_fill_distiller(palette = "Reds", labels = comma, 
         breaks = pretty_breaks(n = 10), values = c(1,0)) + 
    guides(fill = guide_legend(reverse = TRUE)) + 
    theme_nothing(legend = TRUE) + 
    ggtitle('Map of 40109') 

Ecco un campione dei dati da mapdata:

 long  lat order hole piece   group   id 
1 -97.54285 35.51951  1 FALSE  1 40109100100.1 40109100100 
2 -97.54282 35.51954  2 FALSE  1 40109100100.1 40109100100 
3 -97.54280 35.51963  3 FALSE  1 40109100100.1 40109100100 
4 -97.54276 35.51976  4 FALSE  1 40109100100.1 40109100100 
5 -97.54270 35.51993  5 FALSE  1 40109100100.1 40109100100 
6 -97.54266 35.52016  6 FALSE  1 40109100100.1 40109100100 
              NAME state county tract B19013_001 
1 Census Tract 1001, Oklahoma County, Oklahoma 40 109 100100  33440 
2 Census Tract 1001, Oklahoma County, Oklahoma 40 109 100100  33440 
3 Census Tract 1001, Oklahoma County, Oklahoma 40 109 100100  33440 
4 Census Tract 1001, Oklahoma County, Oklahoma 40 109 100100  33440 
5 Census Tract 1001, Oklahoma County, Oklahoma 40 109 100100  33440 
6 Census Tract 1001, Oklahoma County, Oklahoma 40 109 100100  33440 

ha prodotto questa trama.

Map of 40109

Ho anche creato una mappa stradale utilizzando ggmap. Ecco il codice:

map <- get_map(location = c(lon = mean(mapdata$lon), lat = mean(mapdata$lat)) 
       , zoom = 10 
       , maptype = "roadmap" 
       , color = "bw") 
p <- ggmap(map) + 
    scale_x_continuous(limits = c(min(mapdata$lon), max(mapdata$lon)), expand = c(0, 0)) + 
    scale_y_continuous(limits = c(min(mapdata$lat), max(mapdata$lat)), expand = c(0, 0)) 
p 

Ed ecco la mappa che produce.

street map

quando cerco di combinarli se ottengo un errore. Ecco il codice che uso per combinarli e l'errore:

okc <- okc + p 

Error in p + o : non-numeric argument to binary operator 
In addition: Warning message: 
Incompatible methods ("+.gg", "Ops.data.frame") for "+" 

Non sono sicuro del motivo per cui viene visualizzato questo errore. È perché le mappe non sono ridimensionate allo stesso modo? Non riuscivo a capire in che altro modo ridimensionare ggmap se non utilizzando la funzione di zoom molto imprecisa. Se qualcuno ha qualche idea su come stratificare la coropleth sopra la ggmap, sarò molto grato.

Ecco il resto del codice per ricreare il chgopleto ggplot.

library(acs) 
    library(ggplot2) 
    library(ggmap) 
    library(UScensus2010) 
    library(RColorBrewer) 
    library(dplyr) 
    library(scales) 

    #http://api.census.gov/data/key_signup.html 
    api.key.install(key="c369cd6ed053a84332caa62301eb8afe98bed825") 

    # Load in Shape File (You'll need to download this file from the census) 
    #ftp://ftp2.census.gov/geo/tiger/TIGER2013/TRACT/tl_2013_40_tract.zip 

    ## load, subset shapefile 
    geodat<-readShapePoly("insert shapefile here", proj4string=CRS('+proj=longlat +datum=NAD83')) 
    geodat<-geodat[geodat$COUNTYFP==109,] 

    ## fortify for ggplot digestion 
    geodat.f<-fortify(geodat,region="GEOID") 

    # American Community Survey Data: Median HH Income for OK Census Tracts 
    ok.counties=geo.make(state="OK", county="Oklahoma", tract="*") 
    ok.income<-acs.fetch(geography=ok.counties, table.number="B19013", endyear=2013) 


    # Merge Data Sets 
    geo_dat<-geography(ok.income) 
    var_dat<-as.data.frame(estimate(ok.income)) 
    acs_data<-cbind(geo_dat,var_dat) 
    acs_data$id<- paste("40109", acs_data$tract, sep = "") 

    ## from dplyr 
    mapdata<-left_join(geodat.f,acs_data) 

    okc <- ggplot() + 
     geom_polygon(data = mapdata, aes(x = long, y = lat, group = group, 
             fill = B19013_001), color = "black", size = 0.5)+ 
     scale_fill_distiller(palette = "Reds", labels = comma, 
          breaks = pretty_breaks(n = 10), values = c(1,0)) + 
     guides(fill = guide_legend(reverse = TRUE)) + 
     theme_nothing(legend = TRUE) + 
     ggtitle('Map of OKC') 
+3

Con i dati forniti, non posso davvero fare molto. Dato che vuoi disegnare poligoni su una mappa, devi fare qualcosa di simile a questo: 'ggmap (mappa) + geom_polygon (data = mapdata, aes (x = long, y = lat, gruppo = gruppo, riempimento = B19013_001) , color = "black", size = 0.5) 'Penso che si voglia fornire un livello base, che è una mappa, usando' ggmap() ', quindi si disegnano poligoni su di esso. – jazzurro

+0

@jazzurro Sì, è esattamente quello che sto cercando di fare. Il codice che hai fornito è un buon inizio, ma impila il coropleto in cima alla mappa stradale. C'è un modo per cambiare l'opacità del coropleto in modo che tu possa effettivamente vedere cosa c'è sotto? –

+1

Vedo. In tal caso, si desidera utilizzare 'alpha' in' geom_polygon() '. Tu puoi fare; 'ggmap (mappa) + geom_polygon (data = mapdata, aes (x = long, y = lat, gruppo = gruppo, riempimento = B19013_001), color =" nero ", dimensione = 0,5, alpha = 0,5)'. Gioca con il valore alfa (tra 0 e 1) e vedi quale valore ti dà l'immagine giusta. – jazzurro

risposta

3

Questo in realtà è molto meglio fatto in Leaflet. Sembra esteticamente migliore e anche il codice saggio è più intuitivo.

library(leaflet) 
library(rgdal) 
library(RColorBrewer) 

pal <- colorNumeric("OrRd", domain = new$pct_minority_popn) 

leaflet(mapdata) %>% 
addTiles %>% 
addPolygons(stroke=T, fillOpacity=.5, smoothFactor=.5, color=~pal(B19013_001)) %>% 
addLegend("bottomright", pal=pal, values=~B19013_001, title="Legend Title", opacity=.8) 

È possibile modificare la mappa in basso sostituendo i addTiles comando con qualcosa di simile addProviderTiles ("CartoDB.Positron"). Puoi vedere il resto delle opzioni e maggiori informazioni sull'opuscolo su: https://rstudio.github.io/leaflet/basemaps.html