R语言 如何在ggplot2中提取当前默认调色板的值?

kyvafyod  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(128)

我创建了一个ggplot,我使用了viridis包中的三种特定颜色。
下面是我的代码:

library(tidyverse)
library(viridis)
iris %>%
    ggplot(aes(Petal.Length)) +
    geom_histogram(aes(alpha = 0.5), fill = viridis(3)[2]) +
    geom_boxplot(aes(y = 1), alpha = 0.5, width = 2, lwd = 1.5, fill = viridis(3)[3], color = viridis(3)[1]) +
    guides(alpha = "none")

它产生了这个图:

我的问题是颜色是硬编码的。一方面,我使用的是viridis色标,所以当前的代码是多余的。此外,当我全局更改色标时,首先不要将其设置为viridis,我需要更改代码,当它作为一个函数从包中调用时,这很麻烦。
因此,我尝试访问ggplot 2默认的pallete。我看了getOptions()palette(),但都没有我想要的。我也环顾四周,但只找到了访问特定调色板的方法。理想情况下,有像current_default_palette(n)[k]这样的东西来手动设置颜色。
有什么想法吗?谢谢!

xxls0lw8

xxls0lw81#

如果你看一下scale_fill_discrete()的代码,你可以看到它的默认值(如果在调用函数时没有设置type,并且没有全局设置选项“ggplot2.discrete.fill”)为scale_fill_hue,所以这可能就是你要找的:

scale_fill_hue()$palette(5)
[1] "#F8766D" "#A3A500" "#00BF7D" "#00B0F6" "#E76BF3"

类似地,scale_colour_discrete默认为scale_colour_hue ...
我不确定这是否有帮助,但你可以通过ggplot_build检索ggplot正在使用的 * 特定 * 颜色的信息(* 不是 * 调色板的名称)。如果当前打印另存为gg0,则

ggb <- ggplot_build(gg0)
lapply(ggb$data, function(x) lapply(x[c("colour", "fill")], unique))
[[1]]
[[1]]$colour
[1] NA

[[1]]$fill
[1] "#21908CFF"

[[2]]
[[2]]$colour
[1] "#440154FF"

[[2]]$fill
[1] "#FDE725FF"

这确实有点令人困惑,但是:

  • 第一个lapply()在图的 * 层 * 上迭代(每个层都是ggplot_build()输出的$data元素的单独元素
  • 对于每一层,我们提取colourfill列的 unique 元素。在本例中,第一个元素(直方图)只指定了填充(因此颜色列都是NA),而第二个元素(条形图)同时指定了颜色和填充。c型
xoshrz7s

xoshrz7s2#

您可以修改美学默认值:

library(ggplot2)

# cehck default aesthetics, geom_histogram uses the same aes as geom_bar
GeomBar$default_aes
#> Aesthetic mapping: 
#> * `colour`    -> NA
#> * `fill`      -> "grey35"
#> * `linewidth` -> 0.5
#> * `linetype`  -> 1
#> * `alpha`     -> NA
GeomBoxplot$default_aes
#> Aesthetic mapping: 
#> * `weight`    -> 1
#> * `colour`    -> "grey20"
#> * `fill`      -> "white"
#> * `size`      -> NULL
#> * `alpha`     -> NA
#> * `shape`     -> 19
#> * `linetype`  -> "solid"
#> * `linewidth` -> 0.5

# update:
update_geom_defaults("bar", aes(fill = viridis::viridis(3)[2]))
update_geom_defaults("boxplot", aes(fill = viridis::viridis(3)[3], color = viridis::viridis(3)[1]))

# check updated values:
GeomBar$default_aes$fill
#> <quosure>
#> expr: ^viridis::viridis(3)[2]
#> env:  global
GeomBoxplot$default_aes
#> Aesthetic mapping: 
#> * `weight`    -> 1
#> * `colour`    -> `viridis::viridis(3)[1]`
#> * `fill`      -> `viridis::viridis(3)[3]`
#> * `size`      -> NULL
#> * `alpha`     -> NA
#> * `shape`     -> 19
#> * `linetype`  -> "solid"
#> * `linewidth` -> 0.5

iris |>
  ggplot(aes(Petal.Length)) +
  geom_histogram(aes(alpha = 0.5)) +
  geom_boxplot(aes(y = 1), alpha = 0.5, width = 2, lwd = 1.5) +
  guides(alpha = "none")
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

创建于2023-06-14带有reprex v2.0.2

相关问题