2012-11-16 16 views
6

Ich versuche, einige Informationen zu plotten, die vollständige Population und dann eine Teilmenge dieser Population nach Standort auf einer Karte zeigt. Ich habe Datenvisualisierungen gesehen, die konzentrische Kreise oder 3-d invertierte Kegel verwenden, um dies zu vermitteln. Ich kann einfach nicht herausfinden, wie es zu tun in ggplot/ggmapR ggplot2/ggmap konzentrische Kreise als Punkte

Hier ist eine kostenlose Version von der Hand in Paint, die eine grobe Vorstellung davon zeigt, was ich suche zu tun: enter image description here

Hier ist ein grobes Stück von Daten für ein Beispiel:

> dput(df1) 
structure(list(zip = c("00210", "00653", "00952", "02571", "04211", 
"05286", "06478", "07839", "10090", "11559"), city = c("Portsmouth", 
"Guanica", "Sabana Seca", "Wareham", "Auburn", "Craftsbury", 
"Oxford", "Greendell", "New York", "Lawrence"), state = c("NH", 
"PR", "PR", "MA", "ME", "VT", "CT", "NJ", "NY", "NY"), latitude = c(43.005895, 
17.992112, 18.429218, 41.751554, 44.197009, 44.627698, 41.428163, 
41.12831, 40.780751, 40.61579), longitude = c(-71.013202, -66.90097, 
-66.18014, -70.71059, -70.239485, -72.434398, -73.12729, -74.678956, 
-73.977182, -73.73126), timezone = c(-5L, -4L, -4L, -5L, -5L, 
-5L, -5L, -5L, -5L, -5L), dst = c(TRUE, FALSE, FALSE, TRUE, TRUE, 
TRUE, TRUE, TRUE, TRUE, TRUE), totalPop = c(43177, 37224, 37168, 
15492, 1614, 88802, 2587, 80043, 78580, 87461), subPop = c(42705, 
36926, 27556, 10827, 774, 39060, 1542, 21304, 53438, 2896)), .Names = c("zip", 
"city", "state", "latitude", "longitude", "timezone", "dst", 
"totalPop", "subPop"), row.names = c(1L, 50L, 200L, 900L, 1500L, 
2000L, 2500L, 3000L, 3500L, 4000L), class = "data.frame") 

Irgendwelche Vorschläge?

Antwort

10

Die Grundidee ist getrennt GEOMS für die beiden Populationen zu verwenden, um sicherzustellen, das kleinere ist nach dem größeren aufgetragen, so dass seine Schicht ist auf der Oberseite:

library(ggplot2) # using version 0.9.2.1 
library(maps) 

# load us map data 
all_states <- map_data("state") 

# start a ggplot. it won't plot til we type p 
p <- ggplot() 

# add U.S. states outlines to ggplot 
p <- p + geom_polygon(data=all_states, aes(x=long, y=lat, group = group), 
    colour="grey", fill="white") 

# add total Population 
p <- p + geom_point(data=df1, aes(x=longitude, y=latitude, size = totalPop), 
    colour="#b5e521") 

# add sub Population as separate layer with smaller points at same long,lat 
p <- p + geom_point(data=df1, aes(x=longitude, y=latitude, size = subPop), 
    colour="#00a3e8") 

# change name of legend to generic word "Population" 
p <- p + guides(size=guide_legend(title="Population")) 

# display plot 
p 

enter image description here

Von der Karte, es ist klar, dass Ihre Daten nicht-zusammenhängende-US-Standorte enthalten, in diesem Fall möchten Sie möglicherweise verschiedene zugrunde liegende Kartendaten. get_map() von ggmap Paket bietet ein paar Optionen:

require(ggmap) 
require(mapproj) 
map <- get_map(location = 'united states', zoom = 3, maptype = "terrain", 
     source = "google") 
p <- ggmap(map) 

Nach dem Sie die Gesamt und Unter Bevölkerung geom_point() Schichten hinzufügen, und es nach wie vor angezeigt werden soll.

+0

Das ist großartig. Vielen Dank. – screechOwl

+0

Dieser Link verwendet einen ähnlichen Ansatz zum Erstellen von Heat Maps über die Bundesstaaten hinweg http://www.dataincolour.com/2011/07/maps-with-ggplot2/ – chandler