如何用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
相关产品推荐
相关产品推荐

