首页 > 解决方案 > 是否有一个 R 函数可以在用户坐标中绘制一个半径为实心圆

问题描述

是否可以在“用户”坐标中绘制具有半径的真实实心圆?

我尝试了以下方法:

多边形:我不想使用它们,因为我需要生成的 svg 中的真实圆圈。

细分市场

segments(x, y, x, y, lwd=px, lend=0)

对于分段,问题是我找不到在“用户”坐标中指定分段的方法。

生成的图表最后导出为 PDF。

更新 我绘制了一个包含很多元素的图形,并且元素具有不同的宽度。元素的宽度取决于 x 轴的宽度。如果我不使用用户坐标,则 PDF 中的结果不正确,取决于 x 轴。

多边形是一个圆的近似值,如果我使用它们,结果例如 PDF 非常大,性能不好,内存使用率非常高。我在一张图上画了 10,000 多个圆圈。

我将以下代码用于描述的性能问题:

circle <- function(x, y, r, col) {
  edgeCount <- 50
  intervals <- (1:edgeCount) / edgeCount * 2 * pi
  for(i in 1:length(x)) {
    polygon(r[i]*sin(intervals) + x[i], r[i]*cos(intervals) + y[i], col=col[i],border=NA)
  }
}

标签: r

解决方案


如果您对使用spSpatialLine对象的包装器感到满意,您可以试试这个oceanmap包,它有一个非常有用的函数,叫做SpatialCircle(). 它本质上是通过构建一个圆seq()并针对您的中心点坐标 x 和 y 以及您的半径 r 进行调整。它仍然是一组线段(所以不是一条曲线),但使用起来非常简单。

结果:

1

代码:

很简单:

# Load libraries.
library(oceanmap)

# Generate plot window and data.
set.seed(1702)
plot.new()
plot.window(xlim = c(0, 20), ylim = c(0, 10), 
            asp = 1, xaxs = "i",  yaxs = "i")
axis(1)
axis(2)
box()


n <- 1000
x <- runif(n, 0, 20)
y <- runif(n, 0, 10)

for (i in 1:n) { 

    circle <- SpatialCircle(x = x[i], y = y[i], r = 0.1, n = 1000)
    lines(circle)

}

这也适用于 ggplot2 与一些数据争吵。


附录:空间圆的精度

如果您想检查函数中的n(精度)的SpatialCircle()真正含义,请尝试以下操作:

nrow(circle@lines[[1]]@Lines[[1]]@coords)
结果:
[1] 1000

这意味着该对象有 1,000 个坐标对(x 和 y),可以通过这些坐标对绘制一条线。此外,这条线将有 999 个不同的线段,因为第一个和最后一个坐标对总是相同的。证明:

all.equal(circle@lines[[1]]@Lines[[1]]@coords[1, ],
          circle@lines[[1]]@Lines[[1]]@coords[1000, ])
结果:
[1] TRUE

推荐阅读