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

如何排序alphahull提取的点坐标,适配R的lines()与my.symbols?

问题:获取可适配TeachingDemos::my.symbols()的草形有序坐标数据框

我用R的sf包绘制农田示意图,需要为永久草地添加草形符号。此前已通过TeachingDemos::my.symbols()成功添加阔叶树、针叶树和橡树符号,该函数要求输入包含x、y坐标列的矩阵/数据框,且点的顺序需满足lines()可正确绘制线条的要求,针叶树符号示例代码如下:

X11(width = 10, height = 10)
plot(x = 1:10, y = 1:10, type = "n")
ms.cfs <- as.matrix(data.frame(x = c(-0.84, 0, 0.84), y = c(-0.4, 0.67, -0.4)))
library(TeachingDemos)
my.symbols(x = 5.5, y = 5.5, ysize = 3, symb = ms.cfs)

尝试过程中遇到的问题

  1. ms.image加载失败:找到合适的草形图标后,尝试用TeachingDemos::ms.image加载,但会占用全部绘图区域,无法正常使用,验证代码:
library(png)
ms.grass <- readPNG("grass_symbol.png")
my.symbols(x = 2, y = 2, ysize = 1, symb = ms.image(ms.grass, transpose = TRUE))
  1. 提取像素坐标存在冗余:从png包生成的对象中提取非零像素坐标,能看到草形但存在大量冗余点:
ms.grass <- ms.grass[,,4]
ms.grass <- t(ms.grass)
ms.grass <- which(ms.grass != 0, arr.ind = TRUE)
ms.grass[,2] <- 49 - ms.grass[,2]
plot(ms.grass)
  1. 轮廓点顺序错误:使用alphahull包提取正确的轮廓点,绘图显示正常,但提取坐标后顺序错误,无法通过lines()绘制正确草形:
library(alphahull)
ms.gs <- ashape(ms.grass, alpha = 0.75)
plot(ms.gs)

提取坐标的代码:

ms.gs1 <- ms.gs$edges[, c("x1", "y1", "x2", "y2")]
ms.gs1 <- as.data.frame(matrix(t(ms.gs1), byrow = TRUE, ncol = 2))
names(ms.gs1) <- c("x", "y")

核心需求

不需要空间多边形对象,仅需得到类似ms.cfs的有序坐标数据框,保证lines()可正确绘制草形,如何实现?

补充说明:aplpack::puticon()可解决实际绘图需求,但未解决坐标排序的核心问题。


内容的提问来源于stack exchange,提问作者mattu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:43:26