You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:45:06