R:为定义的用户调色板中的值向量分配适当的颜色
R: assign appropriate color to a vector of values from a defined user palette
我有一个数字向量和一个调色板,如下所示。
我不想做任何类型的绘图,我唯一想要的是根据调色板为每个数值分配适当的颜色...
所需的输出将是一个将值与颜色相关联的数据框。有简单的方法吗?
my_palette <- grDevices::colorRampPalette(c("green","black","red"))(11)
my_vector <- c(runif(150,1,10))
my_df <- data.frame(value=my_vector, color=my_palette[1])
> head(my_df)
value color
1 4.029890 #00FF00
2 1.933029 #00FF00
3 4.921888 #00FF00
4 5.467826 #00FF00
5 9.232608 #00FF00
6 7.353821 #00FF00
你可以使用 cut
:
ncolors <- 11
my_palette <- grDevices::colorRampPalette(c("green","black","red"))(ncolors)
my_df <- data.frame(value=my_vector, color=my_palette[cut(my_vector,ncolors)])
head(my_df)
value color
1 1.289565 #00FF00
2 3.651295 #006500
3 4.750783 #003200
4 6.506106 #330000
5 5.615058 #000000
6 3.216121 #009900
你肯定在一条会带你去那里的路上:
library(spatstat)
set.seed( 100 )
my_palette <- grDevices::colorRampPalette(c("green","black","red"))(11)
my_vector <- c(runif(150,1,10))
cmap <- colourmap( my_palette, range=range(my_vector) )
my_df <- data.frame(value=my_vector, color= cmap( my_vector ) )
> head( my_df )
value color
1 3.769895 #006500
2 3.319053 #009900
3 5.970902 #330000
4 1.507448 #00FF00
5 5.216944 #000000
6 5.353937 #000000
另见 this answer
主题变体:
my_palette <- grDevices::colorRampPalette(c("green","black","red"))(11)
set.seed(123)
my_vector <- c(runif(150,1,10))
my_df <- data.frame(value = my_vector,
color = cut(my_vector, 11, labels = my_palette))
head(my_df)
#> value color
#> 1 3.588198 #006500
#> 2 8.094746 #990000
#> 3 4.680792 #003200
#> 4 8.947157 #CC0000
#> 5 9.464206 #FF0000
#> 6 1.410008 #00FF00
由 reprex package (v2.0.0)
于 2021-04-30 创建
您可以使用 colorRamp
而不是 colorRampPalette
,其中 returns 一个将区间 [0,1] 映射到颜色的函数。
myPalette <- colorRamp(c("green","black","red"))
将您的值映射到区间 [0,1]:
my_vector_normalized <- (my_vector - min(my_vector)) / (max(my_vector) - min(my_vector))
然后:
my_df <- data.frame(value = my_vector, color = myPalette(my_vector_normalized))
我有一个数字向量和一个调色板,如下所示。
我不想做任何类型的绘图,我唯一想要的是根据调色板为每个数值分配适当的颜色...
所需的输出将是一个将值与颜色相关联的数据框。有简单的方法吗?
my_palette <- grDevices::colorRampPalette(c("green","black","red"))(11)
my_vector <- c(runif(150,1,10))
my_df <- data.frame(value=my_vector, color=my_palette[1])
> head(my_df)
value color
1 4.029890 #00FF00
2 1.933029 #00FF00
3 4.921888 #00FF00
4 5.467826 #00FF00
5 9.232608 #00FF00
6 7.353821 #00FF00
你可以使用 cut
:
ncolors <- 11
my_palette <- grDevices::colorRampPalette(c("green","black","red"))(ncolors)
my_df <- data.frame(value=my_vector, color=my_palette[cut(my_vector,ncolors)])
head(my_df)
value color
1 1.289565 #00FF00
2 3.651295 #006500
3 4.750783 #003200
4 6.506106 #330000
5 5.615058 #000000
6 3.216121 #009900
你肯定在一条会带你去那里的路上:
library(spatstat)
set.seed( 100 )
my_palette <- grDevices::colorRampPalette(c("green","black","red"))(11)
my_vector <- c(runif(150,1,10))
cmap <- colourmap( my_palette, range=range(my_vector) )
my_df <- data.frame(value=my_vector, color= cmap( my_vector ) )
> head( my_df )
value color
1 3.769895 #006500
2 3.319053 #009900
3 5.970902 #330000
4 1.507448 #00FF00
5 5.216944 #000000
6 5.353937 #000000
另见 this answer
主题变体:
my_palette <- grDevices::colorRampPalette(c("green","black","red"))(11)
set.seed(123)
my_vector <- c(runif(150,1,10))
my_df <- data.frame(value = my_vector,
color = cut(my_vector, 11, labels = my_palette))
head(my_df)
#> value color
#> 1 3.588198 #006500
#> 2 8.094746 #990000
#> 3 4.680792 #003200
#> 4 8.947157 #CC0000
#> 5 9.464206 #FF0000
#> 6 1.410008 #00FF00
由 reprex package (v2.0.0)
于 2021-04-30 创建您可以使用 colorRamp
而不是 colorRampPalette
,其中 returns 一个将区间 [0,1] 映射到颜色的函数。
myPalette <- colorRamp(c("green","black","red"))
将您的值映射到区间 [0,1]:
my_vector_normalized <- (my_vector - min(my_vector)) / (max(my_vector) - min(my_vector))
然后:
my_df <- data.frame(value = my_vector, color = myPalette(my_vector_normalized))