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

如何用R语言ggplot绘制二次平台(Quadratic Plateau)图?

如何用R和ggplot2绘制二次平台(Quadratic Plateau)图

二次平台模型的核心逻辑是:当自变量(此处为氮素)低于临界值时,因变量(产量)随自变量呈二次曲线增长;当自变量超过临界值后,因变量保持稳定(进入平台期)。以下提供两种实现方法,分别适合手动理解原理和专业拟合场景。

方法一:手动计算拐点并绘制

这种方法先拟合二次线性模型,计算出曲线的顶点(即平台开始的临界氮素值),再生成对应预测数据绘图。

步骤1:拟合二次模型并计算临界值

# 加载数据集
nitrogen <- c(10,20,30,40,50,60)
yield <- c(15,25,38,42,35,30)
dataA <- data.frame(nitrogen,yield)

# 拟合二次线性模型
quad_model <- lm(yield ~ poly(nitrogen, 2, raw = TRUE), data = dataA)
coef <- coefficients(quad_model)

# 计算临界氮素值(二次曲线顶点的x坐标):公式为 -b/(2a)
critical_n <- -coef[2]/(2*coef[3])
# 计算平台期的产量(顶点的y坐标)
plateau_y <- coef[1] + coef[2]*critical_n + coef[3]*critical_n^2

步骤2:生成预测数据

# 生成覆盖x轴范围的序列
x_seq <- seq(0, 60, length.out = 100)

# 计算每个x对应的预测产量:拐点前用二次模型预测,拐点后取平台值
pred_y <- ifelse(x_seq <= critical_n,
                 predict(quad_model, newdata = data.frame(nitrogen = x_seq)),
                 plateau_y)

pred_data <- data.frame(nitrogen = x_seq, yield = pred_y)

步骤3:用ggplot2绘图

library(ggplot2)

ggplot(data = dataA, aes(x = nitrogen, y = yield)) +
  geom_point(col = "Black", size = 5) +
  # 添加二次平台拟合线
  geom_line(data = pred_data, color = "dark red", size = 0.5) +
  scale_y_continuous(breaks = seq(0,60,10), limits = c(0,60)) +
  scale_x_continuous(breaks = seq(0,60,10), limits = c(0,60)) +
  labs(x = "Nitrogen", y = "Yield") +
  theme_classic(base_size = 18, base_family = "serif") +
  theme(axis.line = element_line(size = 0.5, colour = "black"))

方法二:用drc包专业拟合二次平台模型

drc包专门用于剂量反应模型拟合,内置了二次平台模型的拟合函数,操作更简洁规范。

步骤1:安装并加载包,拟合模型

# 安装包(首次使用时执行)
# install.packages("drc")
library(drc)

# 拟合二次平台模型
qp_model <- drm(yield ~ nitrogen, data = dataA, fct = LL.2())

# 生成预测数据
x_seq <- seq(0, 60, length.out = 100)
pred_qp <- predict(qp_model, newdata = data.frame(nitrogen = x_seq))
pred_data_qp <- data.frame(nitrogen = x_seq, yield = pred_qp)

步骤2:绘图

ggplot(data = dataA, aes(x = nitrogen, y = yield)) +
  geom_point(col = "Black", size = 5) +
  geom_line(data = pred_data_qp, color = "dark red", size = 0.5) +
  scale_y_continuous(breaks = seq(0,60,10), limits = c(0,60)) +
  scale_x_continuous(breaks = seq(0,60,10), limits = c(0,60)) +
  labs(x = "Nitrogen", y = "Yield") +
  theme_classic(base_size = 18, base_family = "serif") +
  theme(axis.line = element_line(size = 0.5, colour = "black"))

注意事项

  • 两种方法得到的结果会略有差异,drc的非线性拟合更贴合二次平台模型的统计定义;手动方法基于二次线性模型的顶点,适合快速验证。
  • 原代码中的theme_grey会覆盖theme_classic的设置,建议只保留一个主题样式,上述代码已调整为仅使用theme_classic。
  • windows()是Windows系统下的绘图窗口设置,在RStudio或其他环境中可省略,如需导出图片可使用ggsave()函数。

内容的提问来源于stack exchange,提问作者J.K Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:23:55