【问题标题】:How can I find the 'average' of two columns of colors in R?如何在 R 中找到两列颜色的“平均值”?
【发布时间】:2018-08-16 22:33:00
【问题描述】:

我有一个颜色数据框,我想找到一种方法来创建第三列。第三列应由其他两列混合的颜色组成。我有一个示例数据框和一个我认为可以解决问题的函数。它使用 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)

  })) 

有什么想法吗?

【问题讨论】:

    标签: r function colors purrr


    【解决方案1】:

    如果你只是生成一个长度为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)))
    

    或者在base R的mapply

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

    【讨论】:

    • 谢谢你;这真的很有帮助。我仍然无法将其应用于数据框中的所有行。
    • 使用middle=map2_chr(first,second,~rgb(colorRamp(c(.x,.y))(0.5), max=255))
    猜你喜欢
    • 2022-06-30
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    相关资源
    最近更新 更多