You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在样条曲线上添加点: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:03:44