Создание темы ggplot: пользовательские цвета для переменных уровней

Я пытаюсь создать новую тему в ggplot2 для отображения политических партий в моей стране, я хочу установить цвет для некоторых и других, таких как random_party_1 и random_party_2, установить случайный цвет.

data <- data.frame(party = c('FA','PN', 'random_party1','random_party2', 'FA','PN', 'random_party1','random_party2'), 
                   year = c(2010, 2010, 2010, 2010, 2008, 2008, 2008, 2008), 
                   value = c(50, 20, 30, 10, 50, 50, NA, NA), 
                   color = c('#013197','#B0C2D3','assign_random_color1','assign_random_color2','#013197','#B0C2D3','assign_random_color','assign_random_color'))

Затем я хочу использовать это как аргумент заливки или цвета, но я не знаю, как реализовать его, не объявляя его вручную, потому что он будет зависеть от данных каждого года:

cols <- c("FA" = "#013197", "PN" = "#B0C2D3", "random_party1" = "assign_random_color1", "random_party2" = "assign_random_color2")
p + scale_colour_manual(values = cols)

person Paula    schedule 11.06.2020    source источник
comment
Я не уверен, что понимаю ваш вопрос. Вы можете просто взять любой (случайный) цвет и заполнить им "assign_random_color1"? Ваш пример работает для меня, за исключением того, что assign_random_color1 не является допустимым цветом.   -  person Vandenman    schedule 11.06.2020


Ответы (1)


Я думаю, что лучший способ добиться этого — использовать пользовательскую функцию:

colorize <- function(vec)
{
  levs <- if(is.factor(vec)) levels(vec) else levels(factor(vec))
  predefined <- c("FA", "PN")
  pal <- c('#013197','#B0C2D3')
  pal <- pal[match(levs, predefined)]
  blanks <- which(is.na(pal))
  pal[blanks] <- sample(colours(100), length(blanks))
  pal
}

Итак, предположим, что мы настроили ваш график следующим образом:

p <- ggplot(data, aes(factor(year), value, fill = party)) + geom_col(position = "dodge")

Затем мы можем запустить наш код один раз, чтобы получить фиксированные цвета для предопределенных сторон и случайные цвета для неназначенных сторон:

p + scale_fill_manual(values =  colorize(data$party))

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

И мы можем увидеть, как меняются только цвета случайных сторон, если мы снова запустим точно такой же код:

p + scale_fill_manual(values =  colorize(data$party))

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

Создано 11 июня 2020 г. с помощью пакета reprex (v0.3.0)

person Allan Cameron    schedule 11.06.2020