Подтвердить что ты не робот

Карта ggplot с l

Я хочу построить карту мира, используя ggplot2 (v.9), которая объединяет две части, если информация. Следующий пример иллюстрирует:

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

Однако это решение не является хорошим способом отображения как growth, так и category. growth очень заметен, но category почти невозможно увидеть, потому что это просто граница.

Я пытался увеличить размер границ, но без везения (с новым geom_map работать сложно). Кто-нибудь знает, как увеличить размер границы в приведенном выше примере или, что еще лучше, механизм для отображения двух факторов?

Бонусный вопрос: названия стран, такие как те, которые используются в пакете карт (который имеет СССР!), - это данные, используемые в этом примере, являются хрупкими. Я предпочитаю использовать ISO 3166-1 alpha-3 (1). Кто-нибудь знает данные, которые можно легко использовать с ggplot2, который имеет имена стран ISO -... (включены в связанные данные)

Результат:

результат http://ompldr.org/vY3hsYQ

4b9b3361

Ответ 1

Я бы использовал разные диапазоны оттенков для цвета заливки и линии:

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

enter image description here

ИЛИ, используйте заливку для категории и прозрачность для уровня роста.

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)

enter image description here

Это зависит от того, что вы хотите показать.

На всякий случай, вот способ изменения lineize:

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)

enter image description here

Вот версия 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")

enter image description here

Ответ 2

Один из вариантов - сопоставить рост с размером некоторых точек, нанесенных на центр тяжести многоугольников.

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

enter image description here

Или, если вы действительно хотите удвоить цвет кода, вы можете покрасить очки. Обратите внимание, что вы также можете добавить растровую карту спутниковых снимков с новым пакетом OpenStreetMap (бесстыдный плагин).

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)

enter image description here