在R语言中将数值映射到viridis颜色

9
我如何使用预定义比例尺(如从library(“viridis”)中的 viridis )在r中创建一个颜色比例尺函数?问题不是如何在 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"

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


你看到了 beginend 参数吗?例如,使用 scale_fill_viridis(option = "C", begin = .2, end = .9)。你想要一个函数来随机选择这些值吗? - Tunn
谢谢@stackTon,我上面的编辑可能会让问题更清晰。 - lve
3个回答

12

如果您在自己的函数中正确使用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

4

您可以使用 library(colourvalues)(于2018年10月1日在CRAN上发布)为值分配颜色。默认调色板是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"

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"),而不是viridis。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接