如何在ggplot中根据标签字符为注释设置条件颜色
解决ggplot中stat_pvalue_manual注释条条件着色问题
你的代码失效原因是stat_pvalue_manual的colour参数直接传入向量时,不会按数据行对应映射,得通过aes()把颜色和数据框的列绑定,再配合颜色刻度让ggplot识别自定义颜色值。
方案一:基于已生成的color列映射
直接修改stat_pvalue_manual的调用方式,把colour放到aes()里,再用scale_colour_identity()告诉ggplot直接使用列中的颜色字符串:
library(ggplot2) library(rstatix) color_mapping <- function(label) { if (grepl("A", label)) { return("orange") } else if (grepl("B", label)) { return("purple") } else { return("aquamarine") } } my_data <- data.frame( group1 = c("A", "B", "C"), group2 = c("D", "E", "G"), p = c(0.01, 0.05, 0.001), y.position = c(0.8, 0.7, 0.9), label = c( "A vs D: p=0.037 - ns", "B vs E: p=5.78e-06 - ****", "C vs D: p=0.005 - *" ) ) my_data$color <- sapply(my_data$label, color_mapping) my_plot <- ggplot(my_data, aes(x = group1, y = y.position)) + geom_bar(stat = "identity") + stat_pvalue_manual(data = my_data, label = "label", aes(colour = color)) + scale_colour_identity() # 关键:直接使用color列的颜色值 print(my_plot)
方案二:不提前生成color列,直接在映射中判断
可以省去提前生成color列的步骤,直接在aes(colour)里用case_when实现条件判断:
library(ggplot2) library(rstatix) library(dplyr) # 需要dplyr支持case_when my_data <- data.frame( group1 = c("A", "B", "C"), group2 = c("D", "E", "G"), p = c(0.01, 0.05, 0.001), y.position = c(0.8, 0.7, 0.9), label = c( "A vs D: p=0.037 - ns", "B vs E: p=5.78e-06 - ****", "C vs D: p=0.005 - *" ) ) my_plot <- ggplot(my_data, aes(x = group1, y = y.position)) + geom_bar(stat = "identity") + stat_pvalue_manual( data = my_data, label = "label", aes(colour = case_when( grepl("A", label) ~ "orange", grepl("B", label) ~ "purple", TRUE ~ "aquamarine" )) ) + scale_colour_identity() print(my_plot)
两种方案都能实现根据label中的字符为注释条设置对应颜色,核心是通过aes()建立颜色与数据的映射关系,再用scale_colour_identity()让ggplot直接解析颜色字符串。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

