Карта мира с цветовой кодировкой с помощью ggplot2 и geom_map

#r #ggplot2

#r #ggplot2

Вопрос:

Я пытаюсь построить карту мира, где цвет каждой страны зависит от значения переменной в dataframe.

 > affiliation
# A tibble: 252 × 2
                 region value
                  <chr> <dbl>
1                 Aruba     0
2           Afghanistan     0
3                Angola     0
4              Anguilla     0
5               Albania     0
6               Finland     1
7               Andorra     0
8  United Arab Emirates     0
9             Argentina     2
10              Armenia     0
# ... with 242 more rows
  

Код, который у меня есть, работает нормально:

 library(ggplot2)
library(ggthemes)

ggplot(affiliation, aes(map_id = region))   
    geom_map(aes(fill = value), map = worldMap, color='grey', size=0.3)   
    expand_limits(x = worldMap$long, y = worldMap$lat)  
    theme_few() 
    theme(legend.position = "bottom",
         axis.ticks = element_blank(), 
         axis.title = element_blank(), 
         axis.text =  element_blank())  
    scale_fill_gradient(low="white", high="darkblue", name="Number of Affiliates")  
    guides(fill = guide_colorbar(barwidth = 10, barheight = .5))
  

Моя проблема в том, что большинство значений равно 0, 1 или 2, очень мало значений в 20-30, но 1 страна с выбросом имеет значение в 330. Это делает цветовую шкалу бесполезной, потому что эта страна отображается насыщенным цветом, тогда как все страны с гораздо меньшими значениями отображаются белым.

Я попытался заменить geom_map(aes(fill = value),… на geom_map(aes(fill = log(value)),… , но в этом случае масштаб в легенде показывает от 0 до 5 (вместо от 0 до 330).

Что я могу сделать, чтобы лучше контролировать насыщенность цвета многих стран с низкими значениями, чтобы сделать их более заметными на карте мира? Спасибо

Ответ №1:

Большинство непрерывных scale функций в ggplot2 принимают trans аргумент, который определяет преобразование для использования в этой эстетике. Это автоматически обработает преобразование и маркировку.

В вашем примере trans = "log1p" может помочь добавление (не только "log" потому, что ваши данные имеют пару 0 значений) к аргументам to scale_gradient_n .

Комментарии:

1. Отличный шаг вперед. Спасибо. Как я могу изменить легенду, чтобы она отображала диапазон от 0 до 330, а не от 1 до 5?

2. Вы можете использовать breaks аргумент. Итак, если вы хотите использовать цвета из ответа @jdobres: scale_fill_gradientn(name="Number of Affiliates", trans = 'log1p', colours = c('#ff0000', '#cccccc', '#0000ff'), values = c(0, 30, 331) / 331, breaks = c(0, 30, 331))

3. понял. Требуется только включение аргументов breaks и labels в scale_fill_gradient

Ответ №2:

Вместо scale_fill_gradient того, почему бы не попробовать вызвать scale_fill_gradientn , настройка цвета останавливается по мере необходимости. Например:

 scale_fill_gradientn(colours = c('#ff0000', '#cccccc', '#0000ff'), values = c(0, 30, 331))
  

Комментарии:

1. Спасибо. Я не знал scale_fill_gradientn . Было бы неплохо, если бы я мог указать диапазоны в values аргументе, но я не могу найти никакой информации. Возможно ли это?

2. Вы можете приблизиться, предоставив дополнительные остановки. Например, values = c(0, 30, 35, 320, 331), colours = c('red', 'red', 'red', 'green', 'green')