坚持使用dpylr的mutate/summarize将颜色映射到可变级别
问题描述:
我从来没有能够找到一个好办法来做到这一点。我正在尝试创建一个用于将RColorBrewer颜色映射到data_frame中的变量级别的用户函数。我在igraph中绘制节点颜色,它需要一个颜色矢量。在发生错误之前,我已经做到了这一步。坚持使用dpylr的mutate/summarize将颜色映射到可变级别
library(tidyverse)
library(RColorBrewer)
my_data <- data_frame(
x = sample(c('red','white','foo'),25,T)
)
my_data %>%
group_by(x) %>%
mutate(Blues = brewer.pal(n_distinct(x),'Spectral')) ## this doesn't work
我想要一个工作函数。类似以下内容:
function(df,vary){
df %>%
group_by(vary) %>%
mutate(Blues = brewer.pal(n_distinct(vary),'Spectral')) %>%
select(Blues)
}
感谢您的帮助!
答
你不需要group_by
,只要使用mutate
和生成你需要brewer.pal(n_distinct(x), 'Spectral')
的颜色,然后用match
映射颜色的变量:
注意:我使用的tidyeval
语法捕捉NSE风格的变量,因为我们使用dplyr
的函数。但是如果你愿意,你可以选择编程。
var_to_color <- function(df, var) {
var <- enquo(var)
df %>%
mutate(Colors = brewer.pal(n_distinct(!!var), 'Spectral')[match(!!var, unique(!!var))]) %>%
pull(Colors)
}
var_to_color(my_data, x)
# [1] "#FC8D59" "#FFFFBF" "#FFFFBF" "#FFFFBF" "#99D594" "#FFFFBF" "#99D594"
# [8] "#99D594" "#FC8D59" "#FFFFBF" "#FC8D59" "#FFFFBF" "#FFFFBF" "#99D594"
#[15] "#FC8D59" "#FC8D59" "#99D594" "#FFFFBF" "#FC8D59" "#FC8D59" "#FC8D59"
#[22] "#FC8D59" "#FFFFBF" "#FC8D59" "#FC8D59"
my_data$x
# [1] "white" "red" "red" "red" "foo" "red" "foo" "foo" "white"
#[10] "red" "white" "red" "red" "foo" "white" "white" "foo" "red"
#[19] "white" "white" "white" "white" "red" "white" "white"
不使用dplyr
,这需要一个载体的功能,然后将其映射到颜色可能更有意义:
var_to_color <- function(var) brewer.pal(n_distinct(var), 'Spectral')[match(var, unique(var))]
var_to_color(my_data$x)
# [1] "#FC8D59" "#FFFFBF" "#FFFFBF" "#FFFFBF" "#99D594" "#FFFFBF" "#99D594"
# [8] "#99D594" "#FC8D59" "#FFFFBF" "#FC8D59" "#FFFFBF" "#FFFFBF" "#99D594"
#[15] "#FC8D59" "#FC8D59" "#99D594" "#FFFFBF" "#FC8D59" "#FC8D59" "#FC8D59"
#[22] "#FC8D59" "#FFFFBF" "#FC8D59" "#FC8D59"
多少种颜色,你从结果期望?三种颜色的长度25? – Psidom
@Psidom,我想要一列有三种颜色。一个匹配/对应于x中的每个级别。 – elliot