ggplot中geom_smooth未显示问题求助(附代码与样本数据)
解决geom_smooth图层不显示的问题
嘿,作为R语言新手遇到这个问题太正常了,我来帮你搞定!
问题根源
你代码里的Time是factor(因子)类型,而geom_smooth()默认需要连续数值型变量来拟合趋势线。因子属于离散的类别变量,每个时间点都是独立的分类,没办法进行回归拟合计算,所以平滑线自然就显示不出来啦。
解决方案:把Time转换成连续数值变量
我们需要把字符格式的时间转换成可计算的连续数值(比如从当天0点开始的分钟数),这样geom_smooth()就能正常工作了。下面分两种方法实现:
方法1:用lubridate包(推荐,更简洁)
lubridate是处理时间的神器,新手也能快速上手:
# 第一次使用需要先安装包 install.packages("lubridate") library(lubridate) # 把Time转成时间格式,再计算当天的分钟数作为连续变量 R3L12$Time_num <- hour(hms(R3L12$Time)) * 60 + minute(hms(R3L12$Time))
然后用新的连续变量画图:
ggplot(R3L12, aes(x=Time_num, y=HeartRate)) + geom_point() + geom_smooth() # 现在就能看到平滑线了!
如果想让x轴显示原来的时间格式(而不是分钟数),可以调整刻度:
ggplot(R3L12, aes(x=Time_num, y=HeartRate)) + geom_point() + geom_smooth() + scale_x_continuous(breaks = R3L12$Time_num, labels = R3L12$Time) + labs(x = "Time") # 把x轴标题改回Time
方法2:用Base R(不需要额外安装包)
如果不想装新包,用基础R也能实现:
# 把Time转成POSIXlt格式,提取小时和分钟计算总分钟数 time_obj <- as.POSIXlt(R3L12$Time, format = "%H:%M:%S") R3L12$Time_num <- time_obj$hour * 60 + time_obj$min # 同样用Time_num画图 ggplot(R3L12, aes(x=Time_num, y=HeartRate)) + geom_point() + geom_smooth()
额外小贴士
以后处理时间相关的变量时,尽量转换成POSIXct/POSIXlt这类日期时间类型,或者像这样转成连续数值,不管是做可视化还是统计分析都会更方便哦!
内容的提问来源于stack exchange,提问作者Cassidy
相关产品推荐
相关产品推荐

