如何在R中绘制带散点的衰减曲线?使用ggplot2未达预期
解决ggplot2同时绘制散点与衰减曲线的问题
首先看你提供的数据读取代码,这里有个明显的问题——你的数据格式不对,read.table里的文本内容把列名和所有数值都堆在一起了,导致R无法正确识别两列数据(d和weighted_LD)。这会导致后续绘图时数据结构错误,大概率是你只得到线条连接散点的核心原因之一。
第一步:修正数据读取
先把数据整理成每行一对(d值 + weighted_LD值)的格式,这样read.table才能正确解析:
# 修正后的数据读取代码 df <- read.table(text = " d weighted_LD 1.400 0.00002198 1.450 0.00001849 1.500 0.00001652 1.550 0.00001673 1.600 0.00001067 1.650 0.00001647 1.700 0.00001861 1.750 0.00001903 1.800 0.00001949 ", header = TRUE)
第二步:绘制散点 + 衰减曲线
衰减曲线通常是指数衰减模型(比如 y = a * exp(-b*x) + c),ggplot2的geom_smooth默认用线性模型,直接用默认参数得不到衰减曲线,这是第二个关键问题。下面给你两种可行的方法:
方法1:用geom_smooth指定指数衰减模型
通过method = "nls"指定非线性最小二乘拟合,同时给出衰减模型的公式和初始参数:
library(ggplot2) ggplot(df, aes(x = d, y = weighted_LD)) + geom_point(color = "#2c3e50", size = 3) + # 绘制散点 geom_smooth( method = "nls", formula = y ~ a * exp(-b * x) + c, method.args = list(start = list(a = 0.00002, b = 1, c = 0)), # 初始参数要根据你的数据调整 se = FALSE, # 关闭置信区间(如果需要可以设为TRUE) color = "#e74c3c", linewidth = 1.2 ) + labs(x = "Distance (d)", y = "Weighted LD") + theme_minimal()
方法2:手动拟合模型后绘制曲线
如果geom_smooth的nls拟合报错(比如初始参数不合适),可以先手动用nls拟合模型,生成预测数据,再用geom_line绘制曲线:
# 1. 拟合指数衰减模型 decay_model <- nls(weighted_LD ~ a * exp(-b * d) + c, data = df, start = list(a = 0.00002, b = 1, c = 0)) # 2. 生成预测用的x值(更平滑的序列) pred_d <- seq(min(df$d), max(df$d), length.out = 100) pred_df <- data.frame(d = pred_d, weighted_LD = predict(decay_model, newdata = list(d = pred_d))) # 3. 绘图 ggplot() + geom_point(data = df, aes(x = d, y = weighted_LD), color = "#2c3e50", size = 3) + geom_line(data = pred_df, aes(x = d, y = weighted_LD), color = "#e74c3c", linewidth = 1.2) + labs(x = "Distance (d)", y = "Weighted LD") + theme_minimal()
关键注意点
- 初始参数(
start里的a、b、c)要根据你的数据大致调整,如果初始值太离谱,nls会拟合失败,你可以先看散点的趋势:比如a接近最大的y值,b是衰减速率,c是基线值。 - 如果你的衰减模型不是指数型(比如幂函数衰减
y = a * x^(-b)),只需要把公式换成对应的形式即可。
内容的提问来源于stack exchange,提问作者Rindra Rakotoarivony
相关产品推荐
相关产品推荐

