Mapa ggplot z l

Chcę narysować mapę świata za pomocą ggplot2 (V. 9), która łączy dwa elementy if informacji. Poniższy przykład ilustruje:

library(rgdal)
library(ggplot2)
library(maptools)

# Data from http://thematicmapping.org/downloads/world_borders.php.
# Direct link: http://thematicmapping.org/downloads/TM_WORLD_BORDERS_SIMPL-0.3.zip
# Unpack and put the files in a dir 'data'

gpclibPermit()
world.map <- readOGR(dsn="data", layer="TM_WORLD_BORDERS_SIMPL-0.3")
world.ggmap <- fortify(world.map, region = "NAME")

n <- length(unique(world.ggmap$id))
df <- data.frame(id = unique(world.ggmap$id),
                 growth = 4*runif(n),
                 category = factor(sample(1:5, n, replace=T)))

## noise
df[c(sample(1:100,40)),c("growth", "category")] <- NA


ggplot(df, aes(map_id = id)) +
     geom_map(aes(fill = growth, color = category), map =world.ggmap) +
     expand_limits(x = world.ggmap$long, y = world.ggmap$lat) +
     scale_fill_gradient(low = "red", high = "blue", guide = "colorbar")

Jednak To rozwiązanie nie jest miłym sposobem wyświetlania zarówno growth, jak i category. Growth jest bardzo widoczny, ale category jest prawie niemożliwy do zobaczenia, ponieważ jest to tylko granica.

Próbowałem zwiększyć rozmiar obramowań, ale bez powodzenia(Nowa geom_mapka jest trudna do pracy). Czy ktoś wie jak zwiększyć rozmiar obramowania w powyższym przykład, lub jeszcze lepszy, mechanizm wyświetlania dwóch czynników?

dodatkowe pytanie: nazwy krajów, takie jak te używane przez pakiet map (który zawiera ZSRR!) czy dane użyte w przykładzie są kruche. Wolę używać ISO 3166-1 alpha-3(1). Czy ktoś zna dane łatwo użyteczne z ggplot2 który posiada ISO-... nazwy krajów (zawarte w Powiązanych Danych)

Wynik:

Wynik http://ompldr.org/vY3hsYQ

Author: Rasmus, 2012-03-04

2 answers

Użyłbym różnych zakresów odcieni dla wypełnienia i koloru linii:

ggplot(df, aes(map_id = id)) +
  geom_map(aes(fill = growth, color = category), map =world.ggmap) +
  expand_limits(x = world.ggmap$long, y = world.ggmap$lat) +
  scale_fill_gradient(high = "red", low = "white", guide = "colorbar") +
  scale_colour_hue(h = c(120, 240))

Tutaj wpisz opis obrazka

Lub użyj wypełnienia dla kategorii i przejrzystości dla poziomu wzrostu.

ggplot(df, aes(map_id = id)) +
  geom_map(aes(alpha = growth, fill = category), map =world.ggmap) +
  expand_limits(x = world.ggmap$long, y = world.ggmap$lat) +
  scale_alpha(range = c(0.2, 1), na.value = 1)

Tutaj wpisz opis obrazka

To zależy od tego, co chcesz pokazać.

Na wszelki wypadek, oto sposób na zmianę rozmiaru linesize:

ggplot(df, aes(map_id = id)) +
 geom_map(aes(fill = growth, color = category, size = factor(1)), map =world.ggmap) +
 expand_limits(x = world.ggmap$long, y = world.ggmap$lat) +
 scale_fill_gradient(high = "red", low = "white", guide = "colorbar") +
 scale_colour_hue(h = c(120, 240)) + 
 scale_size_manual(values = 2, guide = FALSE)

Tutaj wpisz opis obrazka

Oto wersja HSV:

df$hue <- ifelse(is.na(df$category), 0, as.numeric(df$category)/max(as.numeric(df$category), na.rm=T))
df$sat <- ifelse(is.na(df$growth), 0, df$growth/max(df$growth, na.rm=T))
df$fill <- ifelse(is.na(df$category), "grey50", hsv(df$hue, df$sat))

ggplot(df, aes(map_id = id)) +
 geom_map(aes(fill = fill), map =world.ggmap) +
 expand_limits(x = world.ggmap$long, y = world.ggmap$lat) +
 scale_fill_identity(guide = "none")

Tutaj wpisz opis obrazka

 12
Author: kohske,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-04 23:22:47

Jedną z opcji jest mapowanie wzrostu do wielkości niektórych punktów wykreślonych w centroidzie wielokątów.

centroids <- as.data.frame(coordinates(world.map))
df <- data.frame(df,centroids)

choropleth <-ggplot() +
     geom_map(aes(fill = category, map_id = id),data = df, map =world.ggmap) +
     expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
    scale_fill_hue(na.value=NA)
choropleth



choropleth + geom_point(aes(x=V1,y=V2,size=growth),data=df) +
    scale_area(range=c(0,3))

Tutaj wpisz opis obrazka

Lub jeśli naprawdę chcesz podwoić kolor kodu, możesz pokolorować punkty. Zauważ, że możesz również dodać mapę rastrową zdjęć satelitarnych za pomocą nowego pakietu OpenStreetMap (wtyczka shameless).

library(OpenStreetMap)
library(raster)
rastermap <- openmap(c(70,-179),
        c(-70,179),zoom=2,type='bing')
rastermap <- openproj(rastermap)
autoplot(rastermap,expand=FALSE) +
     geom_map(aes(x=70,y=70,fill = category, map_id = id),data = df,
        map =world.ggmap) +
     expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
    scale_fill_hue(na.value=NA) + 
    geom_point(aes(x=V1,y=V2,colour=growth),data=df) +
    scale_colour_gradient(low = "red", high = "blue", 
        guide = "colorbar",na.value=NA)

Tutaj wpisz opis obrazka

 7
Author: Ian Fellows,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-04 23:15:59