我正在尝试找出如何仅对使用grid.circle创建的圆的一半进行着色的方法。
library(grid)
grid.circle(x=.5, y=.5, r=.25,gp=gpar(lwd=10))
我想让上半部分变成蓝色,下半部分保持白色。
感谢您的帮助!
grid.polygon()
和一些基本的三角学知识,您可以定义一个函数来实现这个功能。grid.circle()
使用的规则相匹配的方式实现这一点,我将原点设置为"npc"
单位,并将圆的半径设置为"snpc"
单位。(有关"npc"
和"snpc"
的含义,请参见?unit
和vignette("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))
这是对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))
我认为还需要进一步的工作,使其可以通过起始和结束角度进行参数化(已完成):
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))
filledArc()
(或filledSemiCircle()
)就可以采用x和y起点的向量,在每个点上绘制相同的“符号”。 (并不是说你应该这样做 - 我肯定太懒了,无法自己完成;) - Josh O'Briengpar()
函数接受更多的参数来控制边框和线条的宽度,可以使用...
或其他列表传递机制或modifyList
函数实现。 - IRTFM