将值映射到r中的viridis颜色

时间:2017-08-13 17:42:37

标签: r

如何在r中创建具有预定义比例的色阶功能(如来自library("viridis") viridis

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

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"

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

3 个答案:

答案 0 :(得分:1)

如果您在自己的函数中正确使用它,并且您知道将创建多少个任意值,那么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

答案 1 :(得分:1)

我认为这可以满足您的需求。其中大部分是从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")地图而不是绿色。

答案 2 :(得分:1)

您可以使用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"