You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ggplot中按指定Group变量为图形元素自定义上色

按Group自定义颜色的分面均值置信区间图表实现方案

数据集

Score<-c(-2, 3, 4, -1, 3, 4, 5, -1, 3, 5, -3, 3, 5, 1, -4, 5, -2, 
         1, 3, 4, -4, 2, -1, 3, 4, -2, 3, 4, -1, 3, 4, 5, -1, 3, 5, -3, 3, 5, 1, -4, 5, -2, 
         1, 3, 4, -4, 2, -1, 3, 4)

Group<-c( "S", "S", "A", "S", "A", "S", "A", "S", "S", "A", "S", "A", "S", "A", 
          "S", "S", "A", "S", "A", "S", "A", "S", "S", "A", "S", "S", "S", "A", "S", "A", "S", "A", "S", "S", "A", "S", "A", "S", "A", 
          "S", "S", "A", "S", "A", "S", "A", "S", "S", "A", "S"
           )

Scenerio_ID <-c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 
                6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 
                6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)


CombinedTable<-data.frame(Score,Group, Scenerio_ID) 

实现方案

要实现按Group(A设为蓝色、S设为绿色)为点和误差线自定义上色,同时保持按Scenerio_ID分面的效果,有两种简洁的实现方式:

方式一:预计算统计量再绘图

先通过dplyr计算每个场景+分组的均值和95%置信区间,再用ggplot可视化:

library(ggplot2)
library(dplyr)

# 计算每个分组+场景的统计量
summary_table <- CombinedTable %>%
  group_by(Scenerio_ID, Group) %>%
  summarise(
    mean_score = mean(Score, na.rm = TRUE),
    se = sd(Score, na.rm = TRUE)/sqrt(n()),
    ci_low = mean_score - qt(0.975, df = n()-1)*se,
    ci_high = mean_score + qt(0.975, df = n()-1)*se
  )

# 生成图表
ggplot(summary_table, aes(x = Group, y = mean_score, color = Group)) +
  geom_errorbar(aes(ymin = ci_low, ymax = ci_high), width = 0.2) +
  geom_point(size = 3) +
  # 自定义颜色映射
  scale_color_manual(values = c("A" = "blue", "S" = "green")) +
  # 按场景分面
  facet_wrap(~Scenerio_ID) +
  theme_minimal() +
  labs(title = "各场景下不同分组的Score均值及置信区间",
       y = "Score均值",
       x = "分组")

方式二:直接用stat_summary统计绘图

无需提前计算统计量,用ggplot的stat_summary直接计算均值和置信区间:

library(ggplot2)

ggplot(CombinedTable, aes(x = Group, y = Score, color = Group)) +
  # 绘制均值点
  stat_summary(fun = mean, geom = "point", size = 3) +
  # 绘制95%置信区间误差线
  stat_summary(fun.data = mean_cl_normal, geom = "errorbar", width = 0.2) +
  # 自定义颜色
  scale_color_manual(values = c("A" = "blue", "S" = "green")) +
  # 按场景分面
  facet_wrap(~Scenerio_ID) +
  theme_minimal() +
  labs(title = "各场景下不同分组的Score均值及置信区间",
       y = "Score均值",
       x = "分组")

关键说明

  • 将color = Group放入全局aes()中,确保点和误差线都继承颜色映射
  • 使用scale_color_manual()精准指定每个Group对应的颜色
  • facet_wrap(~Scenerio_ID)保持原有的按场景分面布局

内容的提问来源于stack exchange,提问作者JamesLancaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:45:09