r - 是否有一个 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)
}
}
解决方案
如果您对使用sp
的SpatialLine对象的包装器感到满意,您可以试试这个oceanmap
包,它有一个非常有用的函数,叫做SpatialCircle()
. 它本质上是通过构建一个圆seq()
并针对您的中心点坐标 x 和 y 以及您的半径 r 进行调整。它仍然是一组线段(所以不是一条曲线),但使用起来非常简单。
结果:
代码:
很简单:
# 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
推荐阅读
- python - Numpy 警告文件未安装在 PATH 上
- visual-studio-code - 单击侧边栏中资源管理器下方的任何项目时,VS Code 资源管理器消失
- python-3.x - Python3:欧。函数只有关键字参数或注释,使用可以支持它们的 inspect.signature() API
- python - 对于这个递归函数,我如何使下面的 python 代码更高效和简单?
- join - SSSD 和领域加入主要问题
- java - 如何确定 PDF 注释在 PDFBox 中是否可见?
- android - 添加两个ontap方法flutter的方法
- reactjs - 如何在 React Js 中使用 Javascript 访问手机屏幕中的网络摄像头
- python - Windows 10 上的 Chromium Edge 91 崩溃
- sql - 在 SQL 中过滤列对