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

ggplot2绘图问询:同图绘制多回归直线及解决曲线未显示问题

问题1:在同一张图中添加TotalSold与Year的回归线

有两种实用方法可以实现需求:

方法1:直接追加图层

在现有代码基础上,新增geom_smooth层并指定y=TotalSold,同时通过颜色区分两条回归线,让图表更清晰:

ggplot(q,aes(Year)) +
  geom_point(aes(y = Price, color = "Price")) +
  geom_smooth(aes(y = Price, color = "Price"), method='lm') +
  geom_smooth(aes(y = TotalSold, color = "TotalSold"), method='lm') +
  labs(color = "指标")  # 自定义图例标题

方法2:转换为长格式数据(更推荐)

ggplot对长格式数据的支持更好,用tidyr包将宽表转成窄表后,可一次性绘制所有变量的回归线,代码更简洁:

library(tidyr)

# 转换数据格式
q_long <- q %>%
  pivot_longer(cols = c(Price, TotalSold), names_to = "Metric", values_to = "Value")

# 绘图
ggplot(q_long, aes(Year, Value, color = Metric)) +
  geom_point() +
  geom_smooth(method = 'lm')

问题2:Age和Weight曲线未显示的解决方法

你的代码存在两个核心问题,对应解决方案如下:

1. 修复语法错误:补全图层连接符+

原代码中geom_line(aes(y = Age))和geom_line(aes(y = Weight))前缺少+,导致R仅执行到geom_line(aes(y = TotalSold)),后续代码被忽略。补全后代码如下:

ggplot(q, aes(Year, Price)) +
  geom_point(aes(color = "Price")) +
  geom_smooth(aes(color = "Price"), method = 'lm') +
  geom_line(aes(y = TotalSold, color = "TotalSold")) +
  geom_line(aes(y = Age, color = "Age")) +
  geom_line(aes(y = Weight, color = "Weight"))

2. 解决数值范围差异导致的图层压缩

即便补全+,如果Age、Weight与Price的数值范围相差过大,这两个变量的曲线会被挤到图的边缘甚至看不到。推荐两种解决方式:

方式A:分面展示(最直观)

转为长格式数据后,用分面将每个变量的趋势单独展示,每个分面使用独立的Y轴刻度:

library(tidyr)

q_long <- q %>%
  pivot_longer(cols = c(Price, TotalSold, Age, Weight), names_to = "Metric", values_to = "Value")

ggplot(q_long, aes(Year, Value)) +
  geom_point() +
  geom_smooth(method = 'lm') +
  facet_wrap(~Metric, scales = "free_y")

方式B:使用双Y轴(谨慎使用,易误导)

将部分变量映射到右侧Y轴,需先将变量缩放到相近范围:

# 假设Age和Weight远小于Price,先乘以合适系数(需根据实际数据调整)
scale_factor <- 100

ggplot(q, aes(Year)) +
  geom_point(aes(y = Price, color = "Price")) +
  geom_smooth(aes(y = Price, color = "Price"), method = 'lm') +
  geom_line(aes(y = TotalSold, color = "TotalSold")) +
  geom_line(aes(y = Age * scale_factor, color = "Age")) +
  geom_line(aes(y = Weight * scale_factor, color = "Weight")) +
  scale_y_continuous(
    name = "Price",
    sec.axis = sec_axis(~./scale_factor, name = "TotalSold/Age/Weight")
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:31:23