R ggplot2 / ggmap concentric circles as points

I am trying to build some information that shows the total population, and then a subset of this population by location on the map. I saw a visualization of data that uses concentric circles or 3 inverted cones to convey this. I just can't figure out how to do this in ggplot / ggmap

Here's a free version in Paint that shows an approximate idea of ​​what I'm looking for: enter image description here

Here's the rough piece of data for an example:

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

Any suggestions?

+6
source share
1 answer

The main idea is to use separate geometries for two populations, making sure that the smaller one is built after the larger one, so its layer is on top:

 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 US 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

The map shows that your data includes disjoint locations in the United States, in which case you may need different basic map data. get_map() from the ggmap package provides several options:

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

After that, you add generic and subsets of geom_point () and display them as before.

+10
source

All Articles