R语言绘图:拟合预测值趋向负数时替换为0展示的实现方法
解决方案
只需对拟合得到的截距值、预测线的输出值统一做下限为0的截断处理,即可满足需求,修改后的完整可运行代码如下:
library(dplyr) library(tidyverse) library(lubridate) dmda<-"2021-07-07" datas <- structure( list(Code = c("CDE","CDE","CDE","CDE"), Days = c(41,42,43,44), Numbers = c(5.5,5.5,6,6.5)), class = "data.frame", row.names = c(NA, -4L)) f1 <- function(dat, code_nm) { dat <- subset(dat, Code == code_nm) plot(Numbers ~ Days, xlim= c(0,45), ylim= c(0,30), xaxs='i',data = dat,main = paste0(dmda, "-", code_nm)) if (var(dat$Numbers)>0){ model <- nls(Numbers ~ b1*Days^2+b2,start = list(b1 = 0,b2 = 0),data = dat, algorithm = "port") new.data <- data.frame(Days = with(dat, seq(min(Days),max(Days),len = 45))) new.data <- rbind(0, new.data) # 预测值做0截断,避免预测线出现负数 pred_val <- pmax(predict(model,newdata = new.data), 0) lines(new.data$Days,pred_val,lwd=2) # 截距做0截断,负数直接替换为0 coef <- max(coef(model)[2], 0) points(0, coef, col="red",pch=19,cex = 2,xpd=TRUE) text(.99,coef + 1,round(coef,1), cex=1.1,pos=4,offset =1,col="black")} else { yz <- unique(dat$Numbers) lines(c(0,dat$Days), c(yz, dat$Numbers), lwd = 2) points(0, yz, col = "red", pch = 19, cex = 2, xpd = TRUE) text(.1,yz+ .5,round(yz,1), cex=1.1,pos=4,offset =1,col="black") } } f1(datas, "CDE")
关键修改说明
- 对预测函数的输出使用
pmax()做截断,保证拟合线所有点的y值都不会小于0,和y轴范围匹配 - 对提取的截距系数使用
max()做截断,当拟合得到的截距为负数时自动替换为0,对应点和标注文本都会同步更新为0
修改后的效果图如下:
内容的提问来源于stack exchange,提问作者user16774617
相关产品推荐
相关产品推荐

