Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有R函数以用户坐标为半径绘制实心圆_R - Fatal编程技术网

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

是否有R函数以用户坐标为半径绘制实心圆,r,R,是否可以在用户坐标中绘制半径为的实圆 我尝试了以下方法: nrow(circle@lines[[1]]@Lines[[1]]@coords) 多边形: 我不想使用它们,因为我需要在生成的svg中使用真正的圆 分段 segments(x, y, x, y, lwd=px, lend=0) 对于线段,存在一个问题,即我找不到一种在用户坐标中指定线段的方法 最终生成的图形将导出为PDF 更新 我画了一个有很多元素的图,元素有一个明显的宽度。元素的宽度取决于x轴的宽度。如果我不使用用户坐标,PDF中

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

我尝试了以下方法:

nrow(circle@lines[[1]]@Lines[[1]]@coords)
多边形: 我不想使用它们,因为我需要在生成的svg中使用真正的圆

分段

segments(x, y, x, y, lwd=px, lend=0)
对于线段,存在一个问题,即我找不到一种在用户坐标中指定线段的方法

最终生成的图形将导出为PDF

更新 我画了一个有很多元素的图,元素有一个明显的宽度。元素的宽度取决于x轴的宽度。如果我不使用用户坐标,PDF中的结果相对于x轴是不正确的

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

我使用以下代码处理所描述的性能问题:

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)

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

all.equal(circle@lines[[1]]@Lines[[1]]@coords[1, ],
          circle@lines[[1]]@Lines[[1]]@coords[1000, ])
结果:
If在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()

什么是泛洪圈,什么是用户单位?这是在基准图还是网格/ggplot中?还是别的什么?然后您提出了svg,您是如何保存它的,使用grDevices::svg还是其他方式?您是否需要在R和svg中的绘图窗口中显示圆圈,或者将其添加到svg文件中就足够了?如果您添加一点示例代码来设置绘图并保存它,这将是一个更好的问题,这样任何想要回答的人都有一个起点…@JohnColeman用户单位或用户坐标是区分数据单位或数据坐标的常用术语。无论绘图的数据纵横比如何,用户单位中的圆在用户看来都是圆,而如果纵横比不是1,则数据单位中的圆可能是椭圆。我使用base,但如果它有效,我可以使用grid或ggplot。此外,您是否尝试过这些可能的重复项的解决方案,建议使用plotrix::draw.circle和
[1] TRUE
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()