Создание коробочного графика с чуть более темными линиями, чем цвет заливки - PullRequest
1 голос
/ 15 апреля 2019

Для создания менее отвлекающих блокпостов было бы неплохо иметь аналогичную цветовую шкалу для fill и color.Как я могу достичь этого без догадок?

Ответы [ 2 ]

4 голосов
/ 15 апреля 2019

Предопределенные цвета (масштаб _ * _ руководство)

Простое решение с использованием colorspace::darken()

Это простейшее решение, я думаю:

library(ggplot2)
library(colorspace)

hex_colors = c(
  setosa = "#80adf7", 
  versicolor = "#96ef8f", 
  virginica = "#f4a1df")

g = ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species, color = Species))
g + geom_boxplot() + 
  scale_fill_manual(values = hex_colors) + 
  scale_color_manual(values = darken(hex_colors, amount = 0.3))

Ручной расчет цветов

Если вы хотите иметь больше контроля, вы можете преобразовать HEX в RGB и немного уменьшить все значения красного, зеленого и синего.Вы также можете преобразовать его в HSV и играть с оттенком, насыщенностью и значением яркости, добавив rgb2hsv к pipelne и вызвав hsv вместо rgb в конце.

library(ggplot2)
library(magrittr)
library(purrr)

hex_colors = c(
  setosa = "#80adf7", 
  versicolor = "#96ef8f", 
  virginica = "#f4a1df")

dark_colors = hex_colors %>% 
  col2rgb %>% #convert HEX colors to RGB Matrix
  "*"(0.7) %>% # make each component "darker"
  apply(2, lift_dv(rgb, maxColorValue = 255)) # Convert each column to HEX again

g = ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species, color = Species))
g + geom_boxplot() + 
  scale_fill_manual(values = hex_colors) + 
  scale_color_manual(values = dark_colors)

Оба подхода приводят к следующему результату:

Boxplots

Автоматические цвета (шкала _ * _ дискретная)

scale_*_discrete работает с цветовым пространством HSL.Мы можем просто определить яркость вручную.

library(ggplot2)
g = ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species, color = Species))
g + geom_boxplot() + 
  scale_fill_discrete(l = 70) + # a bit brighter
  scale_color_discrete(l = 50) # a bit darker

boxplot 2

2 голосов
/ 15 апреля 2019

Другое решение - просто передать alpha() в scale_FOO_manual. При этом нам нужно только указать значения alpha и значения цвета:

library(ggplot2)

color <- c("red", "blue", "green")
alpha_color <- 1
alpha_fill <- 0.2

ggplot(iris, aes(Species, Sepal.Length, fill = Species, color = Species)) +
  geom_boxplot() + 
  scale_fill_manual(values = alpha(color, alpha_fill)) + 
  scale_color_manual(values = alpha(color, alpha_color))

enter image description here

...