2015-10-16 19 views
7

Utworzono choropleth przy użyciu ggplot2. Oto kod ggplotŁączenie choropleth wykonane w ggplot i 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') 

Oto próbka danych z rzecz firmy 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 

Produkowany tej działki.

Map of 40109

Stworzyłem również mapę jezdnia użyciu ggmap. Oto kod:

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 

A oto mapa, którą produkuje.

street map

Kiedy próbuję łączyć je, choć pojawia się błąd. Oto kod, którego używam, aby je połączyć, i błąd:

okc <- okc + p 

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

Nie jestem pewien, dlaczego otrzymuję ten błąd. Czy to dlatego, że mapy nie są skalowane tak samo? Nie mogłem wymyślić, jak inaczej skalować ggmap, poza użyciem bardzo niedokładnej funkcji zoomu. Jeśli ktoś ma jakieś pomysły na temat układania choropleth na szczycie ggmap, będę bardzo wdzięczny.

Oto reszta kodu do odtworzenia choropletu 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

Z podanymi danymi, nie mogę zrobić naprawdę dużo. Ponieważ chcesz narysować wielokąty na górze mapy, chcesz zrobić coś takiego: 'ggmap (mapa) + geom_polygon (dane = dane mapy, aes (x = długie, y = lat, grupa = grupa, wypełnienie = B19013_001) , color = "black", size = 0.5) 'Myślę, że chcesz dostarczyć warstwę bazową, która jest mapą, używając' ggmap() ', a następnie narysuj na niej wielokąty. – jazzurro

+0

@jazzurro Tak, właśnie to próbuję zrobić. Podany kod jest dobrym początkiem, ale układa choropleth na mapie drogi. Czy istnieje sposób na zmianę krycia kartogramu, aby można było zobaczyć, co jest pod spodem? –

+1

Rozumiem. W takim przypadku chcesz użyć 'alpha' w' geom_polygon() '. Możesz to zrobić; 'ggmap (mapa) + geom_polygon (dane = dane mapy, aes (x = długie, y = lat, grupa = grupa, wypełnienie = B19013_001), kolor =" czarny ", rozmiar = 0,5, alfa = 0,5)'. Graj z wartością alfa (od 0 do 1) i zobacz, która wartość daje odpowiedni obraz. – jazzurro

Odpowiedz

3

To jest rzeczywiście znacznie lepiej wykonane w dla pacjenta. Wygląda lepiej estetycznie, a także pod względem kodu jest bardziej intuicyjny.

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) 

Można zmienić dolną mapę zastępując addTiles dowodzić czegoś podobnego addProviderTiles („CartoDB.Positron”). Możesz zobaczyć pozostałe opcje i więcej informacji na ulotce pod adresem: https://rstudio.github.io/leaflet/basemaps.html