【问题标题】:R: assign appropriate color to a vector of values from a defined user paletteR:为定义的用户调色板中的值向量分配适当的颜色
【发布时间】:2021-04-30 07:11:29
【问题描述】:

我有一个数字向量和一个调色板,如下所示。

我不想制作任何类型的图,我唯一想要的就是根据调色板为每个数值分配适当的颜色...

所需的输出是一个将值与颜色相关联的数据框。有简单的方法吗?

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

【问题讨论】:

  • 您能否明确说明将颜色分配给数值的规则?例如,您是否正在寻找介于 0-10 分配为红色、>10-20 分配为蓝色等的值。
  • 对不起!所以调色板是从绿色到红色,所以较低的值应该是绿色和较高的红色。上下限不是绝对的,所以只是数值向量的 min() 和 max()

标签: r numeric color-palette


【解决方案1】:

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

【讨论】:

  • 我能否以简单的方式(但从同一个 my_palette 开始)将中断数更改为 100?
  • 裁切数量应该是调色板的颜色数量:每种颜色1个裁切
  • 但是可以在剪切步骤中增加它吗?因为如果我这样做,我会得到很多 NA 颜色......在生成调色板时应该增加它吗?
  • 对,你应该事先增加调色板中的剪切数量
【解决方案2】:

主题的变体:

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 创建

【讨论】:

    【解决方案3】:

    您肯定走在一条可以带您到达那里的道路上:

    
    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

    【讨论】:

      【解决方案4】:

      您可以使用colorRamp 代替colorRampPalette,它返回一个将区间[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))
      

      【讨论】:

      • 啊,这是非常相关的信息!目前调色板以我在 MWE 中编写的形式传递给我的函数,但我可能会考虑在上游更改它
      猜你喜欢
      • 2015-01-28
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 2018-04-03
      • 2020-11-24
      相关资源
      最近更新 更多