在R中为仅单组有分数的字母设置不同绘图颜色
解决方案
核心思路是先给数据添加分组标识,区分「仅Group1有值」「仅Group2有值」「两组均有值」三种情况,再通过分层绘图或混合颜色映射的方式实现需求。
步骤1:预处理数据
先计算Group1的排名,并添加分组标识列:
library(dplyr) library(ggplot2) # 模拟示例数据(包含Group1/Group2为0的情况) dummy <- data.frame( letter = paste0("a", 1:100), Group1 = c(0.0217, 0.0142, 0, 0.0427, runif(96)), Group2 = c(0.0196, 0, 0.0118, 0.0389, runif(96)) ) # 计算排名并标记分组 rank_df <- dummy %>% mutate( rank = order(order(Group1, decreasing = TRUE)), category = case_when( Group2 == 0 ~ "仅Group1有值", Group1 == 0 ~ "仅Group2有值", TRUE ~ "两组均有值" ) )
方案一:分层绘图(推荐,逻辑更清晰)
通过分层绘制不同分组的文本,分别指定特殊组的固定颜色,其余组保留基于rank的渐变颜色:
# 若未安装ggnewscale包先运行:install.packages("ggnewscale") rank_df %>% ggplot() + # 绘制仅Group1有值的文本,设为红色 geom_text( data = filter(rank_df, category == "仅Group1有值"), aes(Group1, Group2, label = letter), color = "#E63946" ) + # 绘制仅Group2有值的文本,设为深蓝色 geom_text( data = filter(rank_df, category == "仅Group2有值"), aes(Group1, Group2, label = letter), color = "#1D3557" ) + # 为剩余组开启新的颜色映射 ggnewscale::new_scale_color() + # 绘制两组均有值的文本,用rank的渐变配色 geom_text( data = filter(rank_df, category == "两组均有值"), aes(Group1, Group2, label = letter, color = rank) ) + # 用viridis渐变配色(也可替换为scale_color_gradient自定义渐变) scale_color_viridis_c(name = "Group1排名") + labs(x = "Group1", y = "Group2") + theme_minimal()
方案二:混合颜色映射
将特殊组用固定数值标记,与rank值合并为单一颜色映射,实现离散+连续的混合配色:
# 生成混合颜色键 rank_df <- rank_df %>% mutate( color_key = case_when( category == "仅Group1有值" ~ -1, category == "仅Group2有值" ~ -2, TRUE ~ rank ) ) rank_df %>% ggplot(aes(Group1, Group2, label = letter, color = color_key)) + geom_text() + scale_color_gradientn( colors = c("#1D3557", "#E63946", viridis::viridis(100)), breaks = c(-2, -1, min(rank_df$rank), max(rank_df$rank)), labels = c("仅Group2有值", "仅Group1有值", "最低排名", "最高排名"), name = "类别/排名" ) + labs(x = "Group1", y = "Group2") + theme_minimal()
注意事项
- 若未安装
viridis包,先运行install.packages("viridis") - 可根据需求替换示例中的十六进制颜色码,调整为你需要的配色
内容的提问来源于stack exchange,提问作者user21390049
相关产品推荐
相关产品推荐

