簡體   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