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