R语言ggplot2绘制GLM土地利用类别预测概率线报错
报错原因确认
你推测的长度不匹配是触发本次报错的直接原因,但不是代码里存在的唯一问题:
- 直接触发报错的逻辑:你在
ggplot()全局设置中指定数据源为1277行的原始数据集df2022hec,但传入的x、y美学映射对象是长度仅51的独立全局向量Cat9.seq、Cat9.res,后续geom_line里调用的Cat1.res长度同样为51,和数据源行数不匹配,直接触发check_aesthetics()的校验报错。 - 代码里额外存在的两个逻辑bug,哪怕绕过长度校验也无法得到正确图表:
- 计算
Cat9.res时,生成自变量序列的最小值误用了Cat.1列的最小值,不是Cat.9列自身的最小值,预测结果本身计算错误 - 语法逻辑不符合ggplot2的映射规则:基础R的
plot()/lines()是画布式绘图,可以逐次往现有画布添加不同长度、不同坐标范围的元素;但ggplot2是图层化映射,全局声明的数据源和美学属性会默认传递给所有图层,直接传入和数据源长度不匹配的向量本身就不符合语法要求。
- 计算
具体解决方法
ggplot2绘制多系列折线的核心规范是:所有参与绘图的元素需要整理为结构统一的数据框,再做美学映射,不要直接在aes()里调用零散的全局向量。修正后的完整代码如下:
library(ggplot2) # 1. 修正预测值计算逻辑,用length.out直接指定序列点数,避免步长计算误差 ## Cat1类别预测 Cat1.seq <- seq(min(df2022hec$Cat.1), max(df2022hec$Cat.1), length.out = 51) Cat1.res <- invlogit(av.model2022.hec$coefficients["full","(Intercept)"] + av.model2022.hec$coefficients["full","Cat.1"] * Cat1.seq) ## Cat9类别预测(修正之前误用Cat1最小值的错误) Cat9.seq <- seq(min(df2022hec$Cat.9), max(df2022hec$Cat.9), length.out = 51) Cat9.res <- invlogit(av.model2022.hec$coefficients["full","(Intercept)"] + av.model2022.hec$coefficients["full","Cat.9"] * Cat9.seq) # 2. 整理为长格式绘图数据框,后续新增剩余2个土地利用类别时,按相同格式追加即可 plot_data <- rbind( data.frame( lu_class = "Cat1", indicator_value = Cat1.seq, pred_prob = Cat1.res ), data.frame( lu_class = "Cat9", indicator_value = Cat9.seq, pred_prob = Cat9.res ) ) # 3. 绘图 ggplot(plot_data, aes(x = indicator_value, y = pred_prob, color = lu_class)) + geom_line(linewidth = 1) + # 以下为美化配置,可按需调整 labs( x = "土地利用指标值", y = "预测概率", color = "土地利用类别" ) + scale_color_manual(values = c("Cat1" = "darkred", "Cat9" = "steelblue")) + theme_bw()
补充说明:
- 如果需要叠加原始数据的散点、误差条等元素,可以在
ggplot()初始调用时指定原始df2022hec为数据源绘制背景层,再单独给折线图层传入data = plot_data参数,不要在全局aes()里混用不同来源、不同长度的向量。 - 后续补全剩余2个类别的结果时,只需要先完成对应类别的seq和res计算,再往
rbind()里追加对应结构的data.frame即可,不需要额外新增geom_line图层,维护成本更低。
内容的提问来源于stack exchange,提问作者Roos
相关产品推荐
相关产品推荐

