我想绘制一条平滑的曲线,通过所有数据点并基于另一个变量具有一个梯度。理论上多项式插值可以完成任务,但我不确定如何在ggplot中实现。目前我想到的是这样的代码:
数据:
dayofweek hour impressions conversions cvr
1 0 3997982 352.0 8.80e-05
1 1 3182678 321.2 1.01e-04
1 2 2921004 248.6 8.51e-05
1 3 1708627 115.6 6.77e-05
1 4 1225059 98.4 8.03e-05
1 5 1211708 62.0 5.12e-05
1 6 1653280 150.0 9.07e-05
1 7 2511577 309.4 1.23e-04
1 8 3801969 397.8 1.05e-04
1 9 5144399 573.0 1.11e-04
1 10 5770269 675.6 1.17e-04
1 11 6936943 869.8 1.25e-04
1 12 7953053 996.4 1.25e-04
1 13 8711737 1117.8 1.28e-04
1 14 9114872 1217.4 1.34e-04
1 15 9257161 1155.2 1.25e-04
1 16 8437068 1082.0 1.28e-04
1 17 8688057 1047.2 1.21e-04
1 18 9200450 1114.0 1.21e-04
1 19 8494295 1086.8 1.28e-04
1 20 9409142 1092.6 1.16e-04
1 21 10500000 1266.8 1.21e-04
1 22 9783073 1196.4 1.22e-04
1 23 8225267 812.0 9.87e-05
R 代码:
ggplot(d) +
geom_line(aes(y=impressions, x=hour, color=cvr)) +
stat_smooth(aes(y=impressions, x=hour), method = lm, formula = y ~ poly(x, 10), se = FALSE)
使用geom_line可以获得想要的渐变,但它不是平滑的。使用stat_smooth可以获得平滑的线条,但它不会穿过所有数据点,并且没有我想要的渐变。有什么想法可以实现这一点吗?
method="gam"
并更改节点数(或平滑项的维度)来使用stat_smooth
获得类似的结果:stat_smooth(aes(y=impressions, x=hour), formula = y ~ s(x, k = 24), method = "gam", se = FALSE)
。请注意,这不会改变原始含义。 - aosmithk = 24
数字。有什么想法吗? - slhckk = nrow(data)
这样的代码是你需要的? - aosmithgam
方法起作用,而上面答案中的样条方法倾向于超调。这个答案(https://dev59.com/57bna4cB1Zd3GeqPh9zI)使用了spline_shape=-0.5
,非常有效。 - Mark Neal