【问题标题】:How do I draw a "donut" polygon in R?如何在 R 中绘制“甜甜圈”多边形?
【发布时间】:2014-11-07 03:53:30
【问题描述】:

我发现了一个有点相似的问题,但与我想尝试的问题不同。我正在尝试在 R 中画一个中间有洞的圆圈。

我知道如何使用 sampSurf 库画一个圆:

radius = 20
sp.dbh = spCircle(radius, centerPoint=c(x=30,y=80), spID='tree.1') 
plot(sp.dbh$spCircle)

但我想在这个圆周围画一个中间有一个洞的“外环”。有没有办法做到这一点?需要明确的是,圆的外缘应该是环的内缘。感谢您的帮助!

【问题讨论】:

    标签: r ggplot2 polygon


    【解决方案1】:

    这有点难看,但是您可以使用基本图形函数轻松编写自己的函数来绘制这样的形状。我们基本上只是将形状分成两部分(稍微重叠)。

    ring <- function(x,y,outer,inner, border=NULL, col=NA, lty=par("lty"), N=100, ...) {
        t <- seq(0, pi, length.out=N)
        tx <- seq(0-pi/10, pi+pi/10, length.out=N)
        top <- cbind(c(x+cos(tx)*outer, x-cos(tx)*inner), c(y+sin(tx)*outer, y+sin(tx)*inner))
        bot <- cbind(c(x-cos(tx)*outer, x+cos(tx)*inner), c(y-sin(tx)*outer, y-sin(tx)*inner))
        out <- cbind(c(x+cos(t)*outer,x-cos(t)*outer),  c(y+sin(t)*outer, y-sin(t)*outer))
        inn <- cbind(c(x-cos(t)*inner, x+cos(t)*inner), c(y+sin(t)*inner,  y-sin(t)*inner))
        if (!is.na(col)) {
            polygon(top, border=NA, col = col, ...)
            polygon(bot, border=NA, col = col, ...)
        }
        if(!is.null(border)) {
            lines(out, col=border, lty=lty)
            lines(inn, col=border, lty=lty)
        } else {
            lines(out, lty=lty)
            lines(inn, lty=lty)     
        }
    }
    
    #test
    plot(0,0, xlim=c(-10,10), ylim=c(-10,10),type="n", asp=1)
    ring(1,4,5,2)
    

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 2010-10-17
      • 1970-01-01
      • 2013-03-29
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      相关资源
      最近更新 更多