lubridate转换的Duration时长列用ggplot绘图报缺失值警告如何解决
问题原因
- 核心原因:ggplot2 不支持直接将
lubridate::hms()生成的period类型变量作为美学映射的输入。base R的plot()函数会自动将period类型隐式转换为总秒数的数值型,因此可以正常绘图;但ggplot2不会执行这类隐式类型转换,会将无法识别的period类型判定为无效值直接剔除,最终抛出删除缺失值的警告。 - 额外可能诱因:你代码中第一列转换后的列名为
TIME(原数据第一列是全大写的TIME),但ggplot的aes参数里写的是Time(首字母大写),如果列名大小写不匹配,也会导致读取空值触发相同警告。
解决方案
- 方案一:转换为总秒数后自定义Y轴标签(兼容性最好,无额外依赖)
首先将Duration列转换为总秒数的数值型,绘图时再通过scale_y_continuous自定义标签还原时分秒的展示效果,转ggplotly也可正常识别:
library(lubridate) library(ggplot2) library(plotly) # 将period类型转换为总秒数 DF$Duration_sec <- as.numeric(as.duration(DF$Duration)) # 绘图并自定义Y轴显示 p <- ggplot(DF, aes(TIME, Duration_sec)) + geom_point() + scale_y_continuous( name = "Duration", labels = function(x) { per <- seconds_to_period(x) sprintf("%02d:%02d:%02d", hour(per), minute(per), second(per)) } ) ggplotly(p)
- 方案二:使用适配period类型的尺度函数
如果不想手动转换类型,可以调用scale_y_period()函数直接适配period类型,若运行提示函数不存在,优先使用方案一即可:
p <- ggplot(DF, aes(TIME, Duration)) + geom_point() + scale_y_period(name = "Duration") ggplotly(p)
内容的提问来源于stack exchange,提问作者lunae_majicam
相关产品推荐
相关产品推荐

