PAYATHON 2026

如何在 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(),但标签位置会发生调整。

备注:内容仅供参考。