生成一个线条比填充颜色稍暗的箱线图
Generating a boxplot with slightly darker lines then the fill color
为了生成不那么令人分心的箱线图,最好为 fill
和 color
设置相似的色标。
我怎样才能在不靠猜测的情况下实现这一目标?
预定义颜色(scale_*_manual)
使用 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
添加到管道并在末尾调用 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)
两种方法都会导致以下结果:
自动颜色(scale_*_discrete)
scale_*_discrete
使用 HSL 颜色 space。我们可以手动定义亮度。
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
另一种解决方案是简单地将 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))
为了生成不那么令人分心的箱线图,最好为 fill
和 color
设置相似的色标。
我怎样才能在不靠猜测的情况下实现这一目标?
预定义颜色(scale_*_manual)
使用 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
添加到管道并在末尾调用 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)
两种方法都会导致以下结果:
自动颜色(scale_*_discrete)
scale_*_discrete
使用 HSL 颜色 space。我们可以手动定义亮度。
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
另一种解决方案是简单地将 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))