#r #ggplot2
#r #ggplot2
Вопрос:
Я хотел бы использовать ggplot
команду guides(fill = guide_legend(ncol=3))
для отображения моих отдельных категорий в трех столбцах в моей легенде.
Но в идеале я хотел бы
a) Упорядочить ключевые столбцы условных обозначений осмысленным образом (ниже будут все отрицательные категории слева, только 0 посередине и все положительные значения в правом столбце)
б) В идеале также иметь заголовок столбца для каждого столбца (например, «положительный», «ничего», «отрицательный»)
В настоящее время, как вы можете видеть, столбцы просто организованы в порядке уровней факторов. Есть идеи, как это сделать?
Большое спасибо за вашу помощь!
library(tidyverse)
map_data("world") %>%
distinct(region) -> regions
set.seed(1)
regions %>%
mutate(value = sample(-3:3,rep(nrow(regions)),replace=TRUE),
value = factor(value)) %>%
full_join(map_data("world"),by="region") -> world
ggplot(world)
geom_polygon(aes(x=long,y=lat,group=group,fill=value))
guides(fill=guide_legend(ncol=3))
coord_quickmap()
theme_void()
scale_fill_brewer(palette = "RdBu")
theme(legend.position = "bottom")
Комментарии:
1. Быстрый способ выровнять столбцы: вы можете добавить пустые уровни к своему коэффициенту до и после 0, чтобы принудительно поместить 1 и 2 в третий столбец. И вам придется использовать a
scale_fill_manual
и использовать NA на этих дополнительных уровнях.
Ответ №1:
Вы можете попробовать new_scale_fill
функцию ggnewscale
пакета.
library(ggnewscale)
pal_rdbu <- scales::brewer_pal(palette = "RdBu")(7)
ggplot(world)
geom_polygon(aes(x=long,y=lat,group=group,fill=value))
coord_quickmap()
theme_void()
scale_fill_manual(name = "positive", breaks = 3:1,
values=c(NA,NA,NA,NA,pal_rdbu[5:7]))
new_scale_fill()
geom_polygon(aes(x=long,y=lat,group=group,fill=value))
scale_fill_manual( name = "neutral", breaks = 0,
values=c(NA,NA,NA,pal_rdbu[4],NA,NA,NA))
new_scale_fill()
geom_polygon(aes(x=long,y=lat,group=group,fill=value))
scale_fill_manual( name = "negative", breaks = -1:-3,
values=c(pal_rdbu[1:3],NA,NA,NA,NA))
theme(legend.position = "bottom",
legend.direction = 'vertical')