如何在 R 中根据 Group1 和 Group2 的得分为文字标签设置不同颜色?
数据小许
可以根据 Group1 和 Group2 的得分生成分类列,再将它映射到 geom_text() 的 color,分别设置“仅 Group1 有得分”和“仅 Group2 有得分”的文字颜色。
下面将“仅在某组有得分”定义为该组得分大于 0、另一组得分等于 0。如果想表示标签更偏向哪个组,可以使用后面的得分差方案。
为什么按 rank 着色不能表达组别
现有代码中的 rank 只来自 Group1,没有用 Group2 判断标签的类别。rank 也是数值变量,映射到 color 后会得到连续色标。
按组别着色可以使用以下分类规则:
| 条件 | 类别 |
|---|---|
Group1 > 0 且 Group2 == 0 | 仅 Group1 |
Group1 == 0 且 Group2 > 0 | 仅 Group2 |
| 两组得分均大于 0 | 两组都有 |
| 两组得分均等于 0 | 两组均为 0 |
这些规则假设得分为非负数,并且 0 表示该组没有得分。
根据分类设置文字颜色
创建 dummy 后,可以运行以下代码:
library(dplyr)
library(ggplot2)
plot_data <- dummy %>%
mutate(
group_type = case_when(
Group1 > 0 & Group2 == 0 ~ "仅 Group1",
Group1 == 0 & Group2 > 0 ~ "仅 Group2",
Group1 > 0 & Group2 > 0 ~ "两组都有",
Group1 == 0 & Group2 == 0 ~ "两组均为 0",
TRUE ~ NA_character_
)
)
p <- ggplot(
plot_data,
aes(x = Group1, y = Group2, label = letter, color = group_type)
) +
geom_text() +
scale_color_manual(
name = "得分类别",
values = c(
"仅 Group1" = "#D55E00",
"仅 Group2" = "#0072B2",
"两组都有" = "#666666",
"两组均为 0" = "#BBBBBB"
),
na.value = "#000000"
) +
labs(x = "Group1", y = "Group2") +
theme_minimal()
p
case_when() 生成类别,scale_color_manual() 按类别名称指定颜色。颜色映射使用具名向量,方便以后调整颜色或类别顺序。
原始数据中,a45 的 Group1 为 0.0532、Group2 为 0,归入“仅 Group1”;a22 的 Group1 为 0、Group2 为 0.0353,归入“仅 Group2”。
可以查看分类结果,确认是否符合预期:
plot_data %>%
count(group_type)
plot_data %>%
filter(group_type %in% c("仅 Group1", "仅 Group2")) %>%
select(letter, Group1, Group2, group_type)
如果希望颜色表示更偏向哪个组
如果还想显示两组都有得分的标签更偏向哪一组,可以将 Group1 - Group2 映射为连续颜色。正值表示 Group1 得分较高,负值表示 Group2 得分较高,0 表示两组得分相同。
difference_data <- dummy %>%
mutate(score_diff = Group1 - Group2)
p_diff <- ggplot(
difference_data,
aes(x = Group1, y = Group2, label = letter, color = score_diff)
) +
geom_text() +
scale_color_gradient2(
name = "Group1 - Group2",
low = "#0072B2",
mid = "#BBBBBB",
high = "#D55E00",
midpoint = 0
) +
labs(x = "Group1", y = "Group2") +
theme_minimal()
p_diff
这种做法要求两列得分的尺度具有可比性。颜色表示的是原始得分差,不能据此判断统计显著性,也不应直接视为 Scattertext 的评分算法。
交互式绘图与数据处理注意事项
如果使用 plotly,可以在静态图的颜色设置完成后尝试转换:
# 需要先安装 plotly
plotly::ggplotly(p)
转换后的交互图沿用图中已定义的颜色映射,分类逻辑需要在绘图前完成。
还需要留意以下几点:
- 示例按精确的
0判断。如果数据经过浮点运算,可能需要根据得分含义设置接近零的阈值。 NA表示缺失,不能直接当作 0。上面的分类代码会将缺失或不符合规则的记录保留为NA,并用黑色显示。- 多个标签位于相同或相近坐标时仍可能重叠。静态图可以考虑使用
ggrepel::geom_text_repel(),但标签位置会发生调整。
备注:内容仅供参考。
