Ручное упорядочивание цветовой палитры при использовании Discrete_scale для создания пользовательских шкал ggplot2

Я создал настраиваемую шкалу заливки / цвета ggplot2 в качестве оболочки для discrete_scale, единственный параметр в функции шкалы ggplot2, которая охватывает discrete_scale, - это shade. На самом деле у меня есть 4 разные цветовые палитры, которые выбираются на основе этого параметра: светлая, полутоновая, темная, контурная.

Проблема, с которой я столкнулся, заключается в том, что когда я вызываю эти разные оттенки в функциях оболочки шкалы (заливка и цвет), порядок этих цветов меняется. Как я могу обеспечить постоянный порядок?

palette_light_custom <- c("#FF61c3", "#53c1e8", "#82FF73", "#FFFA5C", "#FFA200", "#FF6D5C", "#C478FF", "#C478FF", "#C478FF")
palette_midtone_custom <- c("#f84eb7", "#f3413a", "#f48c00", "#fffa5c", "#56dc5b", "#219ed4", "#b86ef4", "#b86ef4", "#b86ef4")
palette_dark_custom <- c("#e0008a", "#eb0008", "#f48c00", "#fffa5c", "#15a736", "#0085cf", "#8745c6", "#8745c6", "#8745c6")
palette_outline_custom <- c("#a30059", "#005ba1", "#6729a7", "#FFFA5C", "#FFA200", "#FF6D5C", "#C478FF", "#C478FF", "#C478FF")

pal_light <- function() { scales::manual_pal(palette_light_custom) }
pal_midtone <- function() { scales::manual_pal(palette_midtone_custom) }
pal_dark <- function() { scales::manual_pal(palette_dark_custom) }
pal_outline <- function() { scales::manual_pal(palette_outline_custom) }

scale_colour_custom <- function(shade, ...) { 
  if (shade == "light") {
    discrete_scale("colour", "custom", pal_light_custom(), ...) 
  } else if (shade == "midtone") {
    discrete_scale("colour", "custom", pal_midtone_custom(), ...) 
  } else if (shade == "dark") {
    discrete_scale("colour", "custom", pal_dark_custom(), ...) 
  } else if (shade == "outline") {
    discrete_scale("colour", "custom", pal_outline_custom(), ...) 
  } else {
    stop("Incorrect or missing shade parameter in scale_color_custom()")
  }
}

scale_color_custom <- scale_colour_custom

scale_fill_custom <- function(shade, ...) { 
  if (shade == "light") {
    discrete_scale("fill", "custom", pal_light_custom(), ...) 
  } else if (shade == "midtone") {
    discrete_scale("fill", "custom", pal_midtone_custom(), ...) 
  } else if (shade == "dark") {
    discrete_scale("fill", "custom", pal_dark_custom(), ...) 
  } else if (shade == "outline") {
    discrete_scale("fill", "custom", pal_outline_custom(), ...) 
  } else {
    stop("Incorrect or missing shade parameter in scale_color_custom()")
  }
}

ggplot(data=iris,
       aes(x = Sepal.Length,
           color = Species, 
           fill = Spcies)) + 
  geom_density() + 
  scale_colour_custom("outline") +
  scale_fill_custom("midtone") +
  theme_minimal()

Обратите внимание на изображение, что заливка и цвет не совпадают. Как я могу заставить discrete_scale() выбирать порядок, в котором указывается цветовая палитра? введите описание изображения здесь


person Cyrus Mohammadian    schedule 03.02.2021    source источник


Ответы (1)


РЕДАКТИРОВАТЬ

Спасибо за дополнительную информацию в ваших комментариях; это решает вашу проблему?

library(tidyverse)
palette_light_custom <- c("#FF61c3", "#FF6D5C", "#FFA200", "#FFFA5C", "#82FF73", "#53c1e8", "#C478FF", "#C478FF", "#C478FF")
palette_midtone_custom <- c("#f84eb7", "#f3413a", "#f48c00", "#fffa5c", "#56dc5b", "#219ed4", "#b86ef4", "#b86ef4", "#b86ef4")
palette_dark_custom <- c("#e0008a", "#eb0008", "#d97d00", "#fffa5c", "#15a736", "#0085cf", "#8745c6", "#8745c6", "#8745c6")
palette_outline_custom <- c("#ad006b", "#b50006", "#c26f00", "#f7f000", "#006e19", "#005ba1", "#6729a7", "#6729a7", "#6729a7")

scales::show_col(palette_light_custom)
scales::show_col(palette_midtone_custom)
scales::show_col(palette_dark_custom)
scales::show_col(palette_outline_custom)

pal_light <- function() { scales::manual_pal(palette_light_custom) }
pal_midtone <- function() { scales::manual_pal(palette_midtone_custom) }
pal_dark <- function() { scales::manual_pal(palette_dark_custom) }
pal_outline <- function() { scales::manual_pal(palette_outline_custom) }

scale_colour_custom <- function(shade, ...) { 
  if (shade == "light") {
    discrete_scale("colour", "custom", pal_light(), ...) 
  } else if (shade == "midtone") {
    discrete_scale("colour", "custom", pal_midtone(), ...) 
  } else if (shade == "dark") {
    discrete_scale("colour", "custom", pal_dark(), ...) 
  } else if (shade == "outline") {
    discrete_scale("colour", "custom", pal_outline(), ...) 
  } else {
    stop("Incorrect or missing shade parameter in scale_color_custom()")
  }
}

scale_fill_custom <- function(shade, ...) { 
  if (shade == "light") {
    discrete_scale("fill", "custom", pal_light(), ...) 
  } else if (shade == "midtone") {
    discrete_scale("fill", "custom", pal_midtone(), ...) 
  } else if (shade == "dark") {
    discrete_scale("fill", "custom", pal_dark(), ...) 
  } else if (shade == "outline") {
    discrete_scale("fill", "custom", pal_outline(), ...) 
  } else {
    stop("Incorrect or missing shade parameter in scale_color_custom()")
  }
}

ggplot(data=iris,
       aes(x = Sepal.Length,
           color = Species, 
           fill = Species)) + 
  geom_density() + 
  scale_colour_custom("outline") +
  scale_fill_custom("light") +
  theme_minimal()

example_light.png

ggplot(data=iris,
       aes(x = Sepal.Length,
           color = Species, 
           fill = Species)) + 
  geom_density() + 
  scale_colour_custom("outline") +
  scale_fill_custom("midtone") +
  theme_minimal()

example_midtone.png

ggplot(data=iris,
       aes(x = Sepal.Length,
           color = Species, 
           fill = Species)) + 
  geom_density() + 
  scale_colour_custom("outline") +
  scale_fill_custom("dark") +
  theme_minimal()

example_dark.png

person jared_mamrot    schedule 04.02.2021
comment
Спасибо, но это все равно неверно, даже в ваших опубликованных примерах цвета не совпадают. - person Cyrus Mohammadian; 04.02.2021
comment
Если вы хотите, чтобы они были одинаковыми, почему вы не можете использовать одну и ту же палитру: scale_colour_custom("midtone") + scale_fill_custom("midtone") (т.е. полностью избавиться от «контура»)? - person jared_mamrot; 04.02.2021
comment
Контур - это другой набор цветов - более темные оттенки одного базового цвета. Все это очевидно из приведенного выше кода ... - person Cyrus Mohammadian; 04.02.2021