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

ggplot2绘图问题:修改图例名致重复显示及多属性设置失败

解决ToothGrowth数据交互图的两个ggplot问题

需求与问题

  • 目标:绘制带Tukey置信区间的交互图,展示牙齿长度(len)随剂量(dose)和给药方式(supp)的差异;要求OJ用蓝色虚线+圆形均值点,VC用红色实线+方形均值点
  • 遇到的两个问题:
    1. 设置形状和颜色后,修改图例名称会出现两个独立图例
    2. 无法同时通过线型、形状、颜色区分supp类别

解决方案与代码

核心修正思路

  1. 合并图例:确保color、linetype、shape三个映射共享同一个图例名称,避免生成多个独立图例
  2. 统一映射逻辑:在ggplot()的全局aes()中绑定supp到所有需要区分的视觉属性,再通过scale_*_manual()手动指定对应样式,而非在stat_summary中单独设置属性(会覆盖映射)

完整修正代码

library("ggpubr")
require("dplyr")
data("ToothGrowth")

# 数据预处理
df <- ToothGrowth
df$dose <- factor(df$dose,
                  levels = c(0.5, 1, 2),
                  labels = c("D0.5", "D1", "D2"))

# 双向ANOVA与Tukey置信区间计算
res.aov3 <- aov(len ~ supp + dose + supp:dose, data = df)
tukeyHSD <- TukeyHSD(res.aov3, which = "dose")
tukeyCI <- (tukeyHSD$dose[1, 1] - tukeyHSD$dose[1, 2]) / 2

# 修正后的绘图代码
ggplot(df, aes(x = dose, y = len, color = supp, linetype = supp, shape = supp, group = supp)) + 
  # 绘制Tukey置信区间(统一灰色,不参与supp映射)
  stat_summary(fun.y = mean, 
               fun.ymin = function(x) mean(x) - tukeyCI, 
               fun.ymax = function(x) mean(x) + tukeyCI, 
               geom = "errorbar", 
               size = 1, color = 'gray50', width = 0.25) +
  # 绘制均值连线
  stat_summary(fun.y = mean, geom = "line", size = 1) +
  # 绘制均值点(带白色填充增强辨识度)
  stat_summary(fun.y = mean, geom = "point", size = 4, fill = "white") +
  # 手动设置每个supp对应的颜色、线型、形状,统一图例名称
  scale_color_manual(name = "给药方式", 
                     values = c("OJ" = "blue", "VC" = "red")) +
  scale_linetype_manual(name = "给药方式",
                        values = c("OJ" = "dashed", "VC" = "solid")) +
  scale_shape_manual(name = "给药方式",
                     values = c("OJ" = 21, "VC" = 22)) +
  # 主题调整
  theme_minimal(base_size = 16) +
  theme(panel.background = element_rect(fill = "white", colour = "black"))

代码说明

  • 全局aes()中绑定supp到color、linetype、shape,让三个视觉属性基于同一分组变量,自动共享图例
  • 每个scale_*_manual()的name参数设置为相同值,确保图例合并为一个
  • 误差条单独设置为灰色,不参与supp的映射,避免干扰分组样式
  • 选择带填充的点形状(21=圆形、22=方形),配合fill="white"让点的颜色边框更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:01:20