World map with R?

I have an array that tells me the number of observations for a country.

countries <- structure(c(532L, 3L, 1L, 15L, 1L, 1L, 2L, 3L, 16L, 2L, 43L, 1L, 2L, 2L, 1L, 1L, 1L, 3L, 2L, 1L, 4L, 4L, 16L, 13L, 2L, 2L, 9L, 1L, 1L, 5L, 3L, 5L, 1L, 1L, 3L, 1L, 10L, 11L, 4L, 2L, 1L, 7L, 1L, 2L, 6L, 7L, 1L, 6L, 1L, 2L, 7L, 1L, 20L, 1L, 2L, 1L, 3L, 2L, 5L, 76L, 2L, 1L, 1L), .Dim = 63L, .Dimnames = structure(list( c("United States", "Argentina", "Armenia", "Australia", "Austria", "Bangladesh", "Belarus", "Belgium", "Brazil", "Bulgaria", "Canada", "Chile", "China", "Colombia", "Croatia", "Cuba", "Cyprus", "Czech Republic", "Dominican Republic", "Ecuador", "Estonia", "France", "Germany", "Greece", "Guatemala", "Hong Kong", "India", "Indonesia", "Iran", "Ireland", "Israel", "Italy", "Kazakhstan", "Kenya", "Latvia", "Malaysia", "Mexico", "Netherlands", "New Zealand", "Norway", "Peru", "Philippines", "Poland", "Portugal", "Romania", "Russia", "Saudi Arabia", "Serbia", "Singapore", "Slovakia", "South Africa", "South Korea", "Spain", "Sri Lanka", "Sweden", "Switzerland", "Thailand", "Turkey", "Ukraine", "United Kingdom", "Uruguay", "Uzbekistan", "Venezuela" )), .Names = "")) 

I can build a map using the map library. But I would appreciate help in making him look better.

 library(maps) map(database="world") map(database="world", col=countries, fil=countries) legend("topleft", fill = countries, legend = countries, col = countries) box() 

The first big problem is the legend. A continuous scale is likely to look better than one color for each country, but not sure how to do it. Once you decide that everything you can do to look your best would be very helpful.

Thanks!


I can create a dynamic map using googleVis, but I am having problems creating a static map using ggplot2. For example, with ggplot2, it looks like I have no one in the USA.

This is my code.

 #Load My data countries <- structure(list(country = c("United States", "Afghanistan", "Albania", "Argentina", "Armenia", "Australia", "Austria", "Bahrain", "Bangladesh", "Belarus", "Belgium", "Bosnia and Herzegovina", "Brazil", "Bulgaria", "Canada", "Chile", "China", "Colombia", "Croatia", "Cuba", "Cyprus", "Czech Republic", "Denmark", "Dominican Republic", "Ecuador", "Egypt", "El Salvador", "Estonia", "Finland", "France", "Germany", "Greece", "Guatemala", "Haiti", "Hong Kong", "Hungary", "Iceland", "India", "Indonesia", "Iran", "Ireland", "Israel", "Italy", "Japan", "Jordan", "Kazakhstan", "Kenya", "Korea, South", "Latvia", "Libya", "Lithuania", "Macedonia", "Malaysia", "Malta", "Mexico", "Moldova", "Morocco", "Netherlands", "New Zealand", "Nicaragua", "Niger", "Nigeria", "Norway", "Pakistan", "Panama", "Peru", "Philippines", "Poland", "Portugal", "Romania", "Russia", "Saudi Arabia", "Serbia", "Singapore", "Slovakia", "Slovenia", "Somalia", "South Africa", "South Korea", "Spain", "Sri Lanka", "Sweden", "Switzerland", "Taiwan", "Thailand", "Turkey", "Ukraine", "United Arab Emirates", "United Kingdom", "Uruguay", "Uzbekistan", "Venezuela", "Zimbabwe" ), count = c(1224L, 1L, 1L, 4L, 2L, 40L, 2L, 1L, 2L, 5L, 8L, 2L, 40L, 3L, 106L, 4L, 16L, 10L, 8L, 4L, 2L, 5L, 4L, 5L, 3L, 1L, 2L, 5L, 1L, 10L, 26L, 41L, 3L, 1L, 3L, 2L, 1L, 34L, 2L, 3L, 10L, 4L, 19L, 1L, 1L, 1L, 1L, 1L, 4L, 1L, 3L, 1L, 2L, 2L, 36L, 1L, 1L, 31L, 10L, 1L, 1L, 1L, 2L, 6L, 2L, 3L, 29L, 7L, 11L, 13L, 21L, 5L, 9L, 6L, 3L, 2L, 1L, 22L, 2L, 42L, 1L, 3L, 5L, 2L, 6L, 5L, 13L, 2L, 157L, 4L, 1L, 5L, 1L)), .Names = c("country", "count" ), row.names = c(NA, -93L), class = "data.frame") #Make dynamic map library(googleVis) # Make the map! geoMap <- gvisGeoMap(countries, locationvar="country", numvar="count", options=list(dataMode="regions")) plot(geoMap) #Make ggplot2 map library(maps) library(ggplot2) #load world data world <- map_data("world") #Delete Antarctica world <- subset(world,region!="Antarctica") #Add count world$count<-countries$count[match(world$region,countries$country,nomatch=NA)] qplot(long, lat, data = world, group = group, fill=count, geom ="polygon",ylab="",xlab="") 

Why is ggplot2 card incorrect? How can i fix this?

Thanks!

+7
r
source share
2 answers

It may not be exactly what you want, but here is a solution using the googleVis package.

 # I had to change your data a little bit countries2 <- data.frame(country=names(countries), count=as.integer(countries), stringsAsFactors=FALSE) # Install the googleVis package and load it # install.packages("googleVis") library(googleVis) # Make the map! geoMap <- gvisGeoMap(countries2, locationvar="country", numvar="count", options=list(dataMode="regions")) plot(geoMap) 

This will make an interactive geographic map of your data, and when you hover over different regions, it should select it and display a pop counter.

(My apologies - this question was just an excuse to try this package :). )

If you want a static graph, I can also try to do this.

+4
source share

This is my decision.

 #Load My data countries <- structure(list(country = c("United States", "Afghanistan", "Albania", "Argentina", "Armenia", "Australia", "Austria", "Bahrain", "Bangladesh", "Belarus", "Belgium", "Bosnia and Herzegovina", "Brazil", "Bulgaria", "Canada", "Chile", "China", "Colombia", "Croatia", "Cuba", "Cyprus", "Czech Republic", "Denmark", "Dominican Republic", "Ecuador", "Egypt", "El Salvador", "Estonia", "Finland", "France", "Germany", "Greece", "Guatemala", "Haiti", "Hong Kong", "Hungary", "Iceland", "India", "Indonesia", "Iran", "Ireland", "Israel", "Italy", "Japan", "Jordan", "Kazakhstan", "Kenya", "Korea, South", "Latvia", "Libya", "Lithuania", "Macedonia", "Malaysia", "Malta", "Mexico", "Moldova", "Morocco", "Netherlands", "New Zealand", "Nicaragua", "Niger", "Nigeria", "Norway", "Pakistan", "Panama", "Peru", "Philippines", "Poland", "Portugal", "Romania", "Russia", "Saudi Arabia", "Serbia", "Singapore", "Slovakia", "Slovenia", "Somalia", "South Africa", "South Korea", "Spain", "Sri Lanka", "Sweden", "Switzerland", "Taiwan", "Thailand", "Turkey", "Ukraine", "United Arab Emirates", "United Kingdom", "Uruguay", "Uzbekistan", "Venezuela", "Zimbabwe" ), count = c(1224L, 1L, 1L, 4L, 2L, 40L, 2L, 1L, 2L, 5L, 8L, 2L, 40L, 3L, 106L, 4L, 16L, 10L, 8L, 4L, 2L, 5L, 4L, 5L, 3L, 1L, 2L, 5L, 1L, 10L, 26L, 41L, 3L, 1L, 3L, 2L, 1L, 34L, 2L, 3L, 10L, 4L, 19L, 1L, 1L, 1L, 1L, 1L, 4L, 1L, 3L, 1L, 2L, 2L, 36L, 1L, 1L, 31L, 10L, 1L, 1L, 1L, 2L, 6L, 2L, 3L, 29L, 7L, 11L, 13L, 21L, 5L, 9L, 6L, 3L, 2L, 1L, 22L, 2L, 42L, 1L, 3L, 5L, 2L, 6L, 5L, 13L, 2L, 157L, 4L, 1L, 5L, 1L)), .Names = c("country", "count" ), row.names = c(NA, -93L), class = "data.frame") suppressPackageStartupMessages({ library(maptools) library(ggplot2) }) PolygonCoords <- function(polygon) { polygons <- polygon@Polygons coords.list <- lapply(seq_along(polygons), function(i) { # Extract the group, sequence, area, longitude, and latitude. coords <- polygons[[i]]@coords cbind(i, 1:nrow(coords), polygons[[i]]@area, coords) }) coords.df <- as.data.frame(do.call(rbind, coords.list)) names(coords.df) <- c("order", "seq", "area", "long", "lat") return(coords.df) } ConvertWorldSimple <- function(mapdata, min.area = 0) { # min.area is the minimum size of the polygons. Setting to some # positive value will filter out tiny islands. coords.list <- lapply( mapdata@polygons , PolygonCoords) ncoords <- sapply(coords.list, nrow) coords.df <- do.call(rbind, coords.list) coords.df$country <- rep( mapdata@data $NAME, ncoords) country.group <- factor(paste(coords.df$country, coords.df$order)) coords.df$group <- as.numeric(country.group) coords.df <- coords.df[coords.df$area >= min.area, ] return(coords.df) } data("wrld_simpl") world <- ConvertWorldSimple(wrld_simpl, min.area = 0.1) #Delete Antarctica world <- subset(world,country!="Antarctica") #Add count world$count<-countries$count[match(world$country,countries$country,nomatch=NA)] x<-quantile(world$count, na.rm=TRUE) qplot(long, lat, data = world, group = group, fill=count, geom ="polygon",ylab="",xlab="") + scale_fill_gradient(name="log(Number of\nStudents)", trans = "log") 

Thanks for the help!

0
source share

All Articles