如何用预先定义的标度(如library("viridis")中的viridis )在r中创建颜色刻度函数?
问题不在于如何在format中使用它,而是如何构建一个函数,我可以将指定值域中的任意值提供给并检索相应的颜色字符串(rgb、十六进制或任何其他输出格式)。
colorRamp和colorRampPalette似乎只在给定颜色空间内的2种颜色之间进行插值。但我该怎么做,比如病毒呢?
编辑:
由于@sconfluentus的回答,我编写了以下函数,以实现我想要的功能(w/o安全检查):
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"只是想知道是否没有更直接的方法来达到这个结果?
发布于 2017-08-13 18:25:20
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]将它们关联到pairs..or中,您可以根据选择将它们替换到函数中的方式创建成对和颜色的列表。
或者您可以使用colorRampPalette创建一个坡道
map_colors<-colorRampPalette(viridis(12)) # this would create 12 viridis colors发布于 2018-09-30 22:20:03
您可以使用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"发布于 2018-02-15 02:26:42
我觉得这能做你想做的事。其中大部分是从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的数字是黑色的。begin和end的工作方式和在viridis()中一样,但是倒转颜色映射的方向是布尔的reverse参数,而不是1或-1 direction参数。不同的opt值给出了岩浆("A")、地形图("B")和等离子体("C")图,而不是病毒图。
https://stackoverflow.com/questions/45663162
复制相似问题