在样条曲线上添加点:geom_point位置不符的解决求助
在ggforce样条曲线上添加点的解决方案
我明白你的问题了——你想把点直接放在拟合出来的B样条曲线上,而不是原始数据点的位置,对吧?确实默认的geom_point()只会用你输入的x/y坐标,所以第2、3号点才会落在直线段上。你尝试用stat_bspline2搭配geom = "point"没成功,大概率是参数设置或函数选择的问题,下面给你两种可行的解决方法:
方法一:直接用stat_bspline生成曲线上的点
如果你是用原始数据点拟合样条,stat_bspline比stat_bspline2更合适(后者是基于控制点构建样条)。我们可以直接指定它的geom = "point",同时用n参数控制生成的点数,让点精准落在样条曲线上:
library(tidyverse) library(ggforce) # 补全你的数据(假设pt列是点的编号,这里做了合理补全) data <- tibble ( x = c(10, 15, 17, 17, 20, 22, 22, 23, 25, 25, 27, 29), y = c(5, 7, 4, 4, 0, 5, 5, 6, 5, 5, 4, 5.5), g = c("A", "A", "A", "B", "B", "B", "C", "C", "C", "D","D","D"), pt = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3) ) ggplot(data, aes(x = x, y = y, group = g, color = g)) + # 先绘制样条曲线(可选,用来直观对比) stat_bspline(geom = "line", size = 1) + # 在样条曲线上生成点,n=50表示每个分组的样条上生成50个点(数值越大点越密集) stat_bspline(geom = "point", n = 50, size = 2) + theme_minimal()
如果只想在原始数据对应的样条位置上加点,可以把n设为和每个分组的原始点数一致,比如每个分组3个点,就设n=3。
方法二:提取样条坐标后手动加点
如果第一种方法不符合你的需求,还可以先提取样条曲线的坐标数据,再用这些数据绘制点,灵活性更高:
# 先创建包含样条曲线的基础图对象 spline_base <- ggplot(data, aes(x = x, y = y, group = g, color = g)) + stat_bspline(geom = "line", size = 1) + theme_minimal() # 提取样条曲线的所有坐标数据 spline_points <- ggplot_build(spline_base)$data[[1]] # 绘制样条曲线+曲线上的点 ggplot() + geom_line(data = spline_points, aes(x = x, y = y, group = group, color = group), size = 1) + geom_point(data = spline_points, aes(x = x, y = y, group = group, color = group), size = 2) + theme_minimal()
这样提取出来的spline_points就是样条曲线上所有点的精准坐标,用它绘制的点会完全贴合曲线。
内容的提问来源于stack exchange,提问作者ixodid
相关产品推荐
相关产品推荐

