如何在R中找到两列颜色的"平均值"?

ell*_*iot 1 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)

  })) 
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

the*_*ail 5

如果你只生成一个长度调色板1,它总是第一个值.如:

colorRampPalette(c("#000000","#FFFFFF"))(1)
#[1] "#000000"
Run Code Online (Sandbox Code Playgroud)

您需要生成至少3个值,以在两个指定颜色之间取中间值:

colorRampPalette(c("#000000","#FFFFFF"))(3)
#[1] "#000000" "#7F7F7F" "#FFFFFF"
colorRampPalette(c("#000000","#FFFFFF"))(3)[2]
#[1] "#7F7F7F"
Run Code Online (Sandbox Code Playgroud)

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

rgb(colorRamp(c("#000000","#FFFFFF"))(0.5), max=255)
#[1] "#7F7F7F"
Run Code Online (Sandbox Code Playgroud)

有一个帽子提示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)))
Run Code Online (Sandbox Code Playgroud)

或者在基地R中mapply:

mapply(function(x,y) rgb(colorRamp(c(x,y))(0.5), max=255), dat$first, dat$second)
Run Code Online (Sandbox Code Playgroud)