создать карту с адаптированным размером штатов

Привет любителям визуализации!

Я пытаюсь создать график цветовой карты, например этот: как этот (источник: https://github.com/hrbrmstr/albersusa)

НО я хочу, чтобы эти карты были смещены, чтобы площади штатов были пропорциональны значению, которое я предоставляю (в частности, я использую значение GPD). Я имею в виду, что я хочу, чтобы некоторые штаты выглядели больше, а некоторые меньше, чем они есть на самом деле, но максимально напоминая настоящую карту США. Никаких проблем с перемещением штатов или разрушением формы.

Любые идеи? Есть готовые решения? В настоящее время я использую R и пакет albersusa, потому что я знаком с ним. Открыты к изменениям! Мой текущий код для сюжета:

           gmap<-
           ggplot() +
           geom_map(data = counties@data, map = cmap,
                     aes(fill =atan(y/x),alpha=x+y, map_id = name),
                     color = "gray50") +
            geom_map(data = smap, map = smap,
                     aes(x = long, y = lat, map_id = id),
                     color = "black", size = .5, fill = NA) +
            theme_map(base_size = 12) +
            theme(plot.title=element_text(size = 16, face="bold",margin=margin(b=10))) +
            theme(plot.subtitle=element_text(size = 14, margin=margin(b=-20))) +
            theme(plot.caption=element_text(size = 9, margin=margin(t=-15),hjust=0)) +
scale_fill_viridis()+guides(alpha=F,fill=F)

person Maria Koroliuk    schedule 18.07.2017    source источник
comment
Можешь попробовать сделать картограмму? См. здесь.   -  person Axeman    schedule 19.07.2017


Ответы (1)


Вот очень уродливая первая попытка начать работу, используя схемы из пакета maps и некоторые манипуляции с данными из dplyr.

library(maps)
library(dplyr)
library(ggplot2)

# Generate the base outlines
mapbase <- map_data("state.vbm")    

# Load the centroids
data(state.vbm.center)

# Coerce the list to a dataframe, then add in state names
# Then generate some random value (or your variable of interest, like population)
# Then rescale that value to the range 0.25 to 0.95

df <- state.vbm.center %>% as.data.frame() %>% 
  mutate(region = unique(mapbase$region),
         somevalue = rnorm(50),
         scaling = scales::rescale(somevalue, to = c(0.25, 0.95)))
df 

# Join your centers and data to the full state outlines
df2 <- df %>% 
  full_join(mapbase) 
df2

# Within each state, scale the long and lat points to be closer
#   to the centroid by the scaling factor

df3 <- df2 %>% 
  group_by(region) %>% 
  mutate(longscale = scaling*(long - x) + x,
         latscale = scaling*(lat - y) + y) 
df3

# Plot both the outlines for reference and the rescaled polygons

  ggplot(df3, aes(long, lat, group = region, fill = somevalue)) + 
  geom_path() +
  geom_polygon(aes(longscale, latscale)) +
  coord_fixed() + 
  theme_void() + 
  scale_fill_viridis()

введите здесь описание изображения

Эти очертания не самые лучшие, а положение центроидов, к которому они сужаются, приводит к тому, что полигоны иногда перекрывают очертания исходного состояния. Но это начало; вы можете найти лучшие формы для штатов США и различных алгоритмов центроидов.

person Brian    schedule 19.07.2017