繁体   English   中英

将值映射到 r 中的 viridis 颜色

[英]Map values to viridis colours in r

如何创建一个预先定义的规模为r的色标功能(像贻贝library("viridis")

问题不在于如何在ggplot 中使用它,而是如何构建一个函数,我可以将指定值域内的任意值提供给并从中检索相应的颜色字符串(rgb、hex 或任何其他输出格式)。

colorRampcolorRampPalette似乎只在给定颜色空间内的 2 种颜色之间进行插值。 但是,例如,我将如何使用viridis解决这个问题?

编辑:

感谢@sconfluentus 的回答,我编写了以下函数来执行我想要的操作(没有安全检查):

library("viridis")

number_vector <- c(0.772, 1.235, 5.78, 8.890, 10.543, 14.702)

map_viridis <- function(vec, num) {

  vector_expanded <-round(vec, 1) * 10 # expand to allow for decimal precision
  vector_exp_range <- max(vector_expanded) - min(vector_expanded)

  colour_vector <- viridis(vector_exp_range + 1) # get vector of colour values for all possible decimals between min and max value
  value_to_colour <- colour_vector[num * 10 - min(vector_expanded) + 1] # retrieve colour value for number

  return(value_to_colour)

}

map_viridis(number_vector, 0.8) # returns "#440154FF"
map_viridis(number_vector, 3.4) # returns "#424086FF"
map_viridis(number_vector, 14.7) # returns "#FDE725FF"

只是想知道是否有更直接的方法来实现这个结果?

Viridis 本身能够创建您正在寻找的值,前提是您在自己的函数中正确使用它并且您知道将创建多少个任意值。

viridis(12)
 [1] "#440154FF" "#482173FF" "#433E85FF" "#38598CFF" "#2D708EFF" "#25858EFF" "#1E9B8AFF"
 [8] "#2BB07FFF" "#51C56AFF" "#85D54AFF" "#C2DF23FF" "#FDE725FF"

所以你可以创建一个函数,它接受你的域,计算其中值的长度,然后为每个以你选择的方式操作你的数据创建一系列颜色。 它的基础是这样的

num_vals=length(x) # substitute nrow  for length if you have rows instead of a list
col_pal = viridis(num_vals)

只要集合是有序的,那么您就可以简单地使用data[1]col_pal[1]将它们成对关联……或者您可以创建一个对和颜色的列表,具体取决于您选择如何将它们替换到您的函数中。

或者您可以使用colorRampPalette创建一个渐变

map_colors<-colorRampPalette(viridis(12)) # this would create 12 viridis colors

您可以使用library(colourvalues) (在 CRAN 2018 年 10 月 1 日)为值分配颜色。 默认调色板是 viridis。

number_vector <- c(0.772, 1.235, 5.78, 8.890, 10.543, 14.702)

colourvalues::colour_values(number_vector)
# [1] "#440154FF" "#470E60FF" "#2E6E8EFF" "#20A486FF" "#44BF70FF" "#FDE725FF"

我认为这可以满足您的要求。 其中大部分是从viridis函数的来源复制的。 它接受 0 到 1 之间的值,并返回沿 viridis 贴图路径的相应部分的颜色。

get_viridis_color <- function(x, opt="D", begin=0, end=1, reverse=FALSE) {
    x <- x * (end - begin) + begin
    cmap <- viridisLite::viridis.map[viridisLite::viridis.map$opt == opt,]
    if (reverse) cmap <- cmap[rev(seq_len(nrow(cmap))),]
    map_rgbs <- grDevices::rgb(cmap$R, cmap$G, cmap$B)
    ramp <- grDevices::colorRamp(map_rgbs, space="Lab", interpolate="spline")
    out_rgbs <- ramp(x) / 255
    grDevices::rgb(out_rgbs[,1], out_rgbs[,2], out_rgbs[,3])
}

不处理[0, 1]之外的值; 出于某种原因,这意味着负数是#00FF00 ,大于 1 的数字是黑色。 beginend工作就像他们在viridis()所做的那样,但反转颜色图的方向是一个布尔reverse参数,而不是 1 或 -1 direction参数。 opt不同值给出岩浆 ( "A" )、地狱 ( "B" ) 和等离子 ( "C" ) 地图而不是 viridis。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM