如何在ggplot分类X轴的散点图中添加平滑线?
问题:分类变量X轴散点图添加平滑线并保留原标签
数据集
age means 18-24 2.170 25-29 2.396 30-34 2.691 35-39 3.004 40-44 3.517 45-49 4.096 50-54 4.814 55-59 5.445 60-64 5.371 65-69 4.889 70-74 4.947 75-79 5.270 80+ 5.664
尝试的代码
ggplot(pHlt, aes(y = means, x = age)) + geom_point() + geom_smooth(aes(y=means, x=age)) + coord_cartesian(ylim = c(2, 6))
问题描述
上述代码生成的散点图没有平滑线,推测是因为X轴age是分类变量导致的。将age转为数值(取区间最小值)后能正常生成平滑线,但希望保留原有的年龄分类标签,询问是否有实现方法,还是只能采用转为数值的方式?
解决方法
不需要替换原分类变量,有两种灵活方式实现需求:
方法1:给平滑线单独指定数值型X变量
先提取年龄区间的数值(比如取区间最小值,80+可设为80或区间中点82.5),然后在geom_smooth中单独使用这个数值型变量,主图层仍保留分类变量作为X轴:
# 生成数值型年龄变量 pHlt$age_num <- as.numeric(sub("-.*|\\+", "", pHlt$age)) # 给80+设置数值(这里用80,也可以用82.5作为区间中点) pHlt$age_num[pHlt$age == "80+"] <- 80 # 绘图 ggplot(pHlt, aes(y = means, x = age)) + geom_point() + # 平滑线使用数值型x变量,不影响主X轴的分类标签 geom_smooth(aes(x = age_num), method = "loess", se = TRUE) + coord_cartesian(ylim = c(2, 6))
方法2:用数值型变量做X轴,手动替换刻度标签
直接用数值型年龄变量作为X轴,然后通过scale_x_continuous将刻度标签替换为原分类文本:
# 生成数值型年龄变量 pHlt$age_num <- as.numeric(sub("-.*|\\+", "", pHlt$age)) pHlt$age_num[pHlt$age == "80+"] <- 80 # 绘图 ggplot(pHlt, aes(y = means, x = age_num)) + geom_point() + geom_smooth(method = "loess", se = TRUE) + # 将刻度点和标签替换为原分类内容 scale_x_continuous(breaks = pHlt$age_num, labels = pHlt$age) + coord_cartesian(ylim = c(2, 6))
原理说明
geom_smooth的底层平滑函数(比如loess)要求X变量是连续型数值,分类变量(因子)无法被处理,所以必须依赖数值型变量,但可以通过上述两种方式在保留原分类标签的同时生成平滑线。
内容的提问来源于stack exchange,提问作者banjoey
相关产品推荐
相关产品推荐

