颜色指定区域?

时间:2012-10-22 15:53:58

标签: r geometry

我想弄清楚是否有办法只使用grid.circle为我创建的圆圈的一半着色。

    library(grid)
    grid.circle(x=.5, y=.5, r=.25,gp=gpar(lwd=10))

我希望上半部分为蓝色,下半部分为白色。

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

使用grid.polygon()和一些基本的三角函数,你可以定义一个能够做到这一点的函数

需要采取一些挑剔的护理,以便在视口为非方形时填充的半圆不会扭曲。要以符合grid.circle()使用的规则的方式完成此操作,我将原点设置为"npc"个单位,将圆半径设置为"snpc"个单位。 (有关"npc""snpc"含义的更多信息,请参阅?unitvignette("grid")):

library(grid)

filledSemiCircle <- function(x_origin, y_origin, radius, fillcolor, top=TRUE) {
    theta <- seq(0, pi, length = 100)
    if(!top) theta <- theta + pi     ## To fill the bottom instead
    x <- unit(x_origin, "npc") + unit(cos(theta) * radius, "snpc")
    y <- unit(y_origin, "npc") + unit(sin(theta) * radius, "snpc")
    grid.polygon(x, y, gp = gpar(fill = fillcolor))
}

filledSemiCircle(0.5, 0.5, 0.25, "dodgerblue")
filledSemiCircle(0.5, 0.5, 0.25, "gold", top=FALSE)
grid.circle(x = .5, y=.5, r=.25,gp=gpar(lwd=10))

enter image description here

答案 1 :(得分:2)

这是Josh优秀作品改编的第一稿,创造了充满和弦的作品:

filledArc <- function(x_origin, y_origin, radius, fillcolor, top=TRUE) {
    theta <- seq(0, pi/2, length = 100)
    if(!top) theta <- theta + pi     ## To fill the bottom instead
    x <- unit(x_origin, "npc") + unit(c(0, cos(theta) * radius, 0), "snpc")
    y <- unit(y_origin, "npc") + unit(c(0, sin(theta) * radius, 0), "snpc")
    grid.polygon(x, y, gp = gpar(fill = fillcolor))
}

filledArc(0.5, 0.5, 0.25, "lightgoldenrod")
filledArc(0.5, 0.5, 0.25, "blue", top=FALSE)
grid.circle(x = .5, y=.5, r=.25,gp=gpar(lwd=10))

enter image description here

我认为通过开始和结束theta(完成)来进行参数化需要进一步的工作:

filledArc2 <- function(x_origin, y_origin, radius, fillcolor, angle0, angle1) {
    theta.range <- seq(angle0, angle1, length = 100)
    x <- unit(x_origin, "npc") + unit(c(0, cos(theta.range) * radius, 0), "snpc")
    y <- unit(y_origin, "npc") + unit(c(0, sin(theta.range) * radius, 0), "snpc")
    grid.polygon(x, y, gp = gpar(fill = fillcolor))
}

filledArc2(0.5, 0.5, 0.25, "lightgoldenrod", 0,      pi/4)
filledArc2(0.5, 0.5, 0.25, "blue",           pi/4,   pi*(3/2) )
grid.circle(x = .5, y=.5, r=.25,gp=gpar(lwd=10))

enter image description here