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

为何散点图中无法按组别显示拟合回归线?

按组别拟合回归线失败的问题解决

我尝试了多种方法,都没法在散点图里按Group组别显示拟合回归线,试了三段代码都没用,最终出图不符合预期。

我的数据

Light.treatment    Feeding Group
1     Treatment 1  0.02416667     1
2      Treatment 2 0.01800000     1
3      Treatment 3 0.01400000     1
4     Treatment 4  0.07450000     1
5     Treatment 5  0.00600000     1
6     Treatment 6  0.02740000     1
7     Treatment 1  0.02660000     2
8      Treatment 2 0.04033333     2
9      Treatment 3 0.00850000     2
10    Treatment 4  0.01175000     2
11    Treatment 5  0.03600000     2
12    Treatment 6  0.01550000     2

试过的代码

代码1(无效)

df_algaeconsump %>% 
  ggplot(aes(x=`Light treatment`, y=Feeding)) +
  stat_smooth(method="loess") +
  geom_point(aes(colour=Group)) +
  labs(x="Light Treatment", 
       y="Algae consumption")

代码2(无效)

ggplot(df_algaeconsump, aes(x=`Light treatment`, y=Feeding, color = Group) ) +
  geom_point() +
  geom_smooth(method = "lm", alpha = .15, aes(fill = Group))

代码3(无效)

ggplot(subset(df_algaeconsump,Group %in% c("1","2")), aes(x=`Light treatment`, y=Feeding, color=Group)) +
  geom_point() +
  geom_smooth(data=subset(df_algaeconsump, Group=="1"), method="lm" , se=FALSE) +
  geom_smooth(data=subset(df_algaeconsump, Group=="2"), method="lm" , se=FALSE) +
  xlab("Light Treatment") +
  ylab('Algae consumption')

问题原因

核心问题是Light treatment是分类变量(字符串类型,Treatment 1到6是不同类别),而线性回归(lm)或loess拟合要求x是连续数值变量。当前每个分组下每个Treatment只有1个数据点,根本没法拟合出回归线。

解决办法

方法1:把Light treatment转成连续数值(推荐)

把Treatment 1-6提取数字转成1-6的数值,这样x变成连续型,就能按Group拟合跨Treatment的回归线:

# 先处理数据:提取Treatment后面的数字转成数值
df_algaeconsump$Light_num <- as.numeric(sub("Treatment ", "", df_algaeconsump$Light.treatment))

# 绘图:按Group分组拟合回归线,x轴标签保留原分类名
ggplot(df_algaeconsump, aes(x=Light_num, y=Feeding, color=Group, fill=Group)) +
  geom_point(size=3) +
  geom_smooth(method="lm", alpha=0.15, se=TRUE) +
  labs(x="Light Treatment", y="Algae consumption") +
  scale_x_continuous(breaks=1:6, labels=paste("Treatment", 1:6))

方法2:保留分类x轴(仅当有重复数据时有用)

如果后续每个Treatment下每个Group有多个重复数据,可以用这段代码拟合每个组内的趋势,但目前你的数据每个组每个Treatment只有1个点,运行后还是出不了线:

ggplot(df_algaeconsump, aes(x=`Light.treatment`, y=Feeding, color=Group, group=Group)) +
  geom_point() +
  geom_smooth(method="lm", se=FALSE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:47:41