R语言 在散点图中绘制线而不是点

xqnpmsa8  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(241)

我想把图中的点替换成一条线,就像第一张图一样,第二张图就是我的图。

but its not quite what im looking for, I want a smooth line without the points

I think I have to use predict for the 1/x curve but I am not sure how,
1wnzp6jl

1wnzp6jl1#

要进行平滑,可以简单地拟合线性模型:

m <- lm(AM_cost_resorb~I(1/AM_leafP), data=data)

然后在覆盖暴露变量范围的新数据集上提取预测值。

newx <- seq(min(data$AM_leafP), max(data$AM_leafP), by=0.01)
pr <- predict(m, newdata=data.frame(AM_leafP=newx))

想象一下:

plot(AM_cost_resorb~AM_leafP, data=data, type="p", pch= 15, col="red",ylab="Cost of reabsorbtion (kg C m^-2 yr^-1)", xlab="leaf P before senescence (g P/m2)", ylim=c(0,500), las=1)
lines(newx, y=pr, col="blue", lwd=2)

数据:

data <- structure(list(AM_cost_resorb = c(176.01685819061, 21.6704613594849, 
19.007554742708, 50.1865574864131, 17.6174002411188, 40.2758022496774, 
11.0963214407251, 1249.94375253114, 694.894678288085, 339.786950220117, 
42.1452961176151, 220.352895161601, 19.6303352674776, 9.10350287678884, 
10.6222946396451, 44.1984352318898, 21.8069112975004, 42.1237630342764, 
22.7551891190248, 12.9587850506626, 12.0207189111152, 20.2704921282476, 
13.3441156357956, 9.13092569988769, 1781.08346869568, 71.2690023512206, 
80.2376892286713, 344.114362037227, 208.830841645638, 91.1778810401913, 
2220.0120768657, 41.4820962277111, 16.5730025748281, 32.30173229022, 
108.703930214512, 51.6770035143256, 709.071405759588, 87.9618878732223, 
10.4198968123037, 34.4951840238729, 57.8603720445067, 72.3289197551429, 
30.2366643066749, 23.8696161364716, 270.014690419247, 13.8170113452005, 
39.5159584479013, 27.764841260433, 18.0311836472615, 40.5709477295999, 
33.1888820958952, 9.03112843931787, 4.63738971549635, 12.7591169313099, 
4.7998894219979, 8.93458248803248, 7.33904760386628, 12.0940344070925, 
7.17364602165948, 6.514191844409, 9.69911157978057, 6.57874454980745, 
7.90556524435596), AM_leafP = c(0.02840637, 0.230728821, 0.2630533, 
0.099628272, 0.28381032, 0.12414402, 0.45059978, 0.00400018, 
0.00719533500000001, 0.014715103086687, 0.118637201789886, 0.022690875, 
0.254707825, 0.54923913, 0.470708088, 0.113126176837872, 0.22928510745, 
0.118697847481752, 0.219730100850697, 0.38583864, 0.4159485, 
0.24666396693114, 0.374696992776912, 0.547589605297248, 0.00280728, 
0.070156727820596, 0.062314855376136, 0.01453005323695, 0.02394282358199, 
0.0548378613646, 0.00225224, 0.120533928, 0.301695482, 0.15479046, 
0.045996497, 0.096754836, 0.00705147600000001, 0.0568428, 0.47985120103071, 
0.14494777, 0.08641493, 0.069128642, 0.165362156, 0.20947132, 
0.018517511, 0.36187275779699, 0.126531158458224, 0.180083867690804, 
0.277297380904852, 0.1232408972382, 0.15065285976048, 0.55364067, 
1.07819275643191, 0.39187665, 1.04169066418176, 0.55962324, 0.68128731, 
0.41342697, 0.69699564, 0.76755492, 0.515511133042674, 0.760023430328564, 
0.632465844687028)), class = "data.frame", row.names = c(NA, 
-63L))
mwkjh3gx

mwkjh3gx2#

假设f(1/x)很好地拟合数据,可以使用lm()函数来固定期望函数y= a/x + B,然后使用predict()函数来估计期望点。
如果需要更复杂的非线性函数来拟合数据,则可能需要nls()

x<- c(176.01685819061, 21.6704613594849, 19.007554742708, 50.1865574864131, 17.6174002411188, 40.2758022496774, 11.0963214407251, 1249.94375253114, 694.894678288085, 339.786950220117, 42.1452961176151, 220.352895161601, 19.6303352674776, 9.10350287678884, 10.6222946396451, 44.1984352318898, 21.8069112975004, 42.1237630342764, 22.7551891190248, 12.9587850506626, 12.0207189111152, 20.2704921282476, 13.3441156357956, 9.13092569988769, 1781.08346869568, 71.2690023512206, 80.2376892286713, 344.114362037227, 208.830841645638, 91.1778810401913, 2220.0120768657, 41.4820962277111, 16.5730025748281, 32.30173229022, 108.703930214512, 51.6770035143256, 709.071405759588, 87.9618878732223, 10.4198968123037, 34.4951840238729, 57.8603720445067, 72.3289197551429, 30.2366643066749, 23.8696161364716, 270.014690419247, 13.8170113452005, 39.5159584479013, 27.764841260433, 18.0311836472615, 40.5709477295999, 33.1888820958952, 9.03112843931787, 4.63738971549635, 12.7591169313099, 4.7998894219979, 8.93458248803248, 7.33904760386628, 12.0940344070925, 7.17364602165948, 6.514191844409, 9.69911157978057, 6.57874454980745, 7.90556524435596)
y<- c(0.02840637, 0.230728821, 0.2630533, 0.099628272, 0.28381032, 0.12414402, 0.45059978, 0.00400018, 0.00719533500000001, 0.014715103086687, 0.118637201789886, 0.022690875, 0.254707825, 0.54923913, 0.470708088, 0.113126176837872, 0.22928510745, 0.118697847481752, 0.219730100850697, 0.38583864, 0.4159485, 0.24666396693114, 0.374696992776912, 0.547589605297248, 0.00280728, 0.070156727820596, 0.062314855376136, 0.01453005323695, 0.02394282358199, 0.0548378613646, 0.00225224, 0.120533928, 0.301695482, 0.15479046, 0.045996497, 0.096754836, 0.00705147600000001, 0.0568428, 0.47985120103071, 0.14494777, 0.08641493, 0.069128642, 0.165362156, 0.20947132, 0.018517511, 0.36187275779699, 0.126531158458224, 0.180083867690804, 0.277297380904852, 0.1232408972382, 0.15065285976048, 0.55364067, 1.07819275643191, 0.39187665, 1.04169066418176, 0.55962324, 0.68128731, 0.41342697, 0.69699564, 0.76755492, 0.515511133042674, 0.760023430328564, 0.632465844687028)

#data frame for prediction
df <- data.frame(x=sort(x))

# fit model y= a/x + b
model <-lm( y ~ I(1/x))
#summary(model)

#plot model
plot(df$x, predict(model, df), type="l", col="blue")
#optional
points(x, y)

  • 最新情况----对评论意见的答复 *
  1. x在数据框中排序,这样点就按顺序绘制。如果不这样,线可能从x=1到x=100,再回到x=10等,从而造成混乱。尝试删除排序,看看会发生什么。
  2. I(1/x)项是用信号通知lm首先对x执行逆变换,然后执行最小二乘回归。
  3. predict()函数将模型和数据框作为输入,输出为预测值(即y值)。请参阅?predict.lm

相关问题