使用ggplot2绘制gapminder可视化时geom_point分布异常的排查
问题解决步骤
你的核心问题是用了预测数据集来绘制散点,导致点呈现拟合线的分布,而目标图应该展示gapminder的真实观测数据点。以下是具体调整方案:
1. 筛选原始数据中的目标大洲
先从gapminder原始数据里提取非洲和欧洲的真实观测值:
real_data <- subset(gapminder, continent %in% c("Africa", "Europe"))
2. 修改ggplot代码中的图层设置
- 把
geom_point的数据源指定为上面的real_data,展示真实的国家数据点 - 替换
geom_smooth为geom_line,用已计算好的预测拟合值(避免重新拟合模型) - 保留原有颜色、主题、图例等设置
修改后的完整代码:
library(gapminder) library(ggplot2) library(scales) # 保留原有的模型拟合和预测计算 (out <- lm(formula = lifeExp ~ gdpPercap + pop + continent, data = gapminder)) (min_gdp = min(gapminder$gdpPercap)) (max_gdp = max(gapminder$gdpPercap)) (med_pop = median(gapminder$pop)) (pred_df = expand.grid(gdpPercap = (seq(from = min_gdp, to = max_gdp, length.out = 100)), pop = med_pop, continent = c("Africa", "Americas", "Asia", "Europe", "Oceania"))) (pred_out = predict(object = out, newdata = pred_df, interval = "predict")) pred_df$lifeExp <- predict(out, newdata = pred_df) pred_df = cbind(pred_df, pred_out) filtered_data <- subset(pred_df, continent %in% c("Africa", "Europe")) line_colors <- c("seagreen", "slateblue4") # 新增:筛选原始数据中的真实观测点 real_data <- subset(gapminder, continent %in% c("Africa", "Europe")) # 修改后的ggplot代码 ggplot(data = filtered_data, aes(x = gdpPercap, y = lifeExp, color = continent)) + geom_ribbon(aes(ymin = lwr, ymax = upr, fill = continent), alpha = 0.2, linetype = 0, color = NA) + # 指定geom_point用真实数据 geom_point(data = real_data, aes(color = continent), size = 3, alpha = 0.8) + # 用geom_line绘制模型拟合线,替代geom_smooth geom_line(linewidth = 1) + scale_x_log10(labels = scales::dollar) + scale_color_manual(values = line_colors) + scale_fill_manual(values = line_colors) + scale_shape_manual(values = c(16, 17)) + theme_bw() + theme(legend.title = element_blank())
调整说明
geom_point改用真实数据后,点会呈现原始数据的分散分布,符合目标图要求- 用
geom_line替代geom_smooth,确保绘制的是你通过lm模型计算出的拟合线,而非ggplot自动重新拟合的结果 - 其他设置(颜色填充、主题、对数坐标轴等)保留原有配置,符合作业要求
内容的提问来源于stack exchange,提问作者Ahn Seoyeong
相关产品推荐
相关产品推荐

