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