将值映射到 r 中的 viridis 颜色

lve*_*lve 4 r

如何在 r 中使用预定义的比例(如viridis from library("viridis")?

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

colorRamp并且colorRampPalette似乎只在给定颜色空间内的 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"
Run Code Online (Sandbox Code Playgroud)

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

sco*_*tus 6

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

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

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

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

只要该集合是有序的,那么您就可以简单地使用data[1]并将col_pal[1]它们成对关联……或者您可以根据您选择将它们替换到您的函数中的方式来创建对和颜色的列表。

或者你可以创建一个斜坡colorRampPalette这样

map_colors<-colorRampPalette(viridis(12)) # this would create 12 viridis colors
Run Code Online (Sandbox Code Playgroud)