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

ggplot2与broom:如何为因子vs连续变量的绘图添加线条

为分组模型的R²值添加连线或水平线(ggplot2实现)

我来帮你搞定这个需求!首先咱们得先把每个大洲模型的R²值完整提取出来,再用ggplot2实现你想要的两种可视化效果。

第一步:完整提取分组模型的R²值

你的代码已经做了分组拟合的第一步,我把它补全,用broom::glance()提取模型的关键统计量(包括R²):

library(dplyr)
library(ggplot2)
library(gapminder)
library(broom)

# 按大洲筛选数据、分组拟合模型,提取R²值
model_stats <- gapminder %>% 
  filter(continent != "Oceania") %>% 
  group_by(continent) %>% 
  do(glance(lm(lifeExp ~ year + pop + log(gdpPercap), data = .))) %>% 
  ungroup() %>% 
  select(continent, r.squared) # 只保留大洲和R²列

第二步:实现两种可视化效果

1. 用线条连接所有点(类似趋势连线)

因为x轴是离散的大洲类别,需要给geom_line()指定group=1,让ggplot把所有点归为一组来连线:

ggplot(model_stats, aes(x = continent, y = r.squared)) +
  geom_point(size = 3, color = "#2c3e50") + # 绘制实心点
  geom_line(aes(group = 1), color = "#3498db", linetype = "dashed") + # 连接所有点的虚线
  labs(title = "各洲模型的R²值(带连线)",
       x = "大洲",
       y = "R²值") +
  theme_minimal()

2. 传统点图样式(为每个点绘制水平线)

这种样式是每个类别对应一条从y轴底部(R²=0)延伸到点的水平线,用geom_segment()来实现:

ggplot(model_stats, aes(x = continent, y = r.squared)) +
  geom_segment(aes(x = continent, xend = continent, y = 0, yend = r.squared),
               color = "#bdc3c7", size = 1) + # 绘制从y=0到点的水平线
  geom_point(size = 4, color = "#e74c3c") + # 把点放在线条上方突出显示
  labs(title = "各洲模型的R²值(传统点图样式)",
       x = "大洲",
       y = "R²值") +
  ylim(0, 1) + # 固定R²的范围在0-1,更符合统计意义
  theme_minimal()

额外选项:为每个R²值添加贯穿图的水平参考线

如果需要显示每个R²在整个图中的位置,可以用geom_hline():

ggplot(model_stats, aes(x = continent, y = r.squared)) +
  geom_hline(data = model_stats, aes(yintercept = r.squared),
             color = "#95a5a6", linetype = "dotted") + # 每条R²对应的水平参考线
  geom_point(size = 3, color = "#27ae60") +
  labs(title = "各洲模型的R²值(带水平参考线)",
       x = "大洲",
       y = "R²值") +
  theme_minimal()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:46:41