繁体   English   中英

是否有R函数绘制用户坐标为半径的实心圆

[英]Is there an R function to draw a solid circle with a radius in user coordinates

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

我尝试了以下方法:

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

区隔

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

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

最终的图形最终导出为PDF。

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

多边形是一个圆的近似值,如果使用它们,则结果非常大,例如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)
  }
}

如果您对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并进行一些数据处理。


附录:空间圆的精度

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

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

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

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

如果自己在Gregor2的帮助下找到了解决方案,那确实使我进入了“网格”库。

library(grid)
#draw frame using normal plot
plot(0, 0, cex=0)

margins <- par("mar")

#1: bottom 2:left 3:top 4:right
mb <- unit(margins[1], "lines")
ml <- unit(margins[2], "lines")

mt <- unit(margins[3], "lines")
mr <- unit(margins[4], "lines")

#create viewport equivalent to margins in par
pushViewport(viewport(x = ml, y = mb, width = unit(1, "npc") - ml - mr, height = unit(1, "npc") - mb - mt, just=c("left", "bottom"), clip=TRUE))

#draw circle in npc units (easily convertable to user units using grconvertX)
grid.draw(circleGrob(x=0.5, y=0.5, r=0.5, default.units="npc", gp=gpar(col="blue", fill="blue")))

popViewport()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM