首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以r表示的viridis颜色的映射值

以r表示的viridis颜色的映射值
EN

Stack Overflow用户
提问于 2017-08-13 17:42:36
回答 3查看 6.4K关注 0票数 6

如何用预先定义的标度(如library("viridis")中的viridis )在r中创建颜色刻度函数?

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

colorRampcolorRampPalette似乎只在给定颜色空间内的2种颜色之间进行插值。但我该怎么做,比如病毒呢?

编辑:

由于@sconfluentus的回答,我编写了以下函数,以实现我想要的功能(w/o安全检查):

代码语言:javascript
复制
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"

只是想知道是否没有更直接的方法来达到这个结果?

EN

回答 3

Stack Overflow用户

发布于 2017-08-13 18:25:20

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

代码语言:javascript
复制
viridis(12)
 [1] "#440154FF" "#482173FF" "#433E85FF" "#38598CFF" "#2D708EFF" "#25858EFF" "#1E9B8AFF"
 [8] "#2BB07FFF" "#51C56AFF" "#85D54AFF" "#C2DF23FF" "#FDE725FF"

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

代码语言:javascript
复制
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]将它们关联到pairs..or中,您可以根据选择将它们替换到函数中的方式创建成对和颜色的列表。

或者您可以使用colorRampPalette创建一个坡道

代码语言:javascript
复制
map_colors<-colorRampPalette(viridis(12)) # this would create 12 viridis colors
票数 10
EN

Stack Overflow用户

发布于 2018-09-30 22:20:03

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

代码语言:javascript
复制
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"
票数 4
EN

Stack Overflow用户

发布于 2018-02-15 02:26:42

我觉得这能做你想做的事。其中大部分是从viridis函数的源复制的。它接受0到1之间的值,并返回一个颜色,这是沿着viridis地图的对应部分。

代码语言:javascript
复制
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")图,而不是病毒图。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45663162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档