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
相关产品推荐
相关产品推荐

