如何找到R中两列颜色的“平均值”?

时间:2018-08-16 22:33:01

标签: r function colors purrr

我有一个颜色数据框,我想找到一种创建第三列的方法。第三列应包含其他两个列的混合色。我有一个示例数据框和一个我认为可以解决问题的函数。它使用R的colorRampPalette()函数和purrr::map2()。但是,这将返回一个列出的列,该列在不列出时与数据框中的第一列相同。

# Create a function for colors

x <- RColorBrewer::brewer.pal(11, 'Spectral')

spectral_col <- colorRampPalette(x)

# Apply this function to 

tibble(first = sample(spectral_col(100)),
       second = sample(spectral_col(100))) %>% 
  mutate(middle.color = map2(first, second, function(x, y){
    k <- colorRampPalette(c(x, y))
    k(1)

  })) 

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

如果仅生成长度为1的调色板,则它将始终是第一个值。 如:

colorRampPalette(c("#000000","#FFFFFF"))(1)
#[1] "#000000"

您需要至少生成3个值才能采用两种指定颜色之间的中间值:

colorRampPalette(c("#000000","#FFFFFF"))(3)
#[1] "#000000" "#7F7F7F" "#FFFFFF"
colorRampPalette(c("#000000","#FFFFFF"))(3)[2]
#[1] "#7F7F7F"

如果要指定更精确的中点,也可以使用colorRamp作为替代:

rgb(colorRamp(c("#000000","#FFFFFF"))(0.5), max=255)
#[1] "#7F7F7F"

借助r2evans的提示,可以将其放在purrr函数中:

dat <- tibble(first = sample(spectral_col(100)),
       second = sample(spectral_col(100)))

dat %>%
  mutate(middle=map2_chr(first,second, ~rgb(colorRamp(c(.x,.y))(0.5), max=255)))

或在基数R的mapply中:

mapply(function(x,y) rgb(colorRamp(c(x,y))(0.5), max=255), dat$first, dat$second)