我想弄清楚是否有办法只使用grid.circle为我创建的圆圈的一半着色。
library(grid)
grid.circle(x=.5, y=.5, r=.25,gp=gpar(lwd=10))
我希望上半部分为蓝色,下半部分为白色。
感谢您的帮助!
答案 0 :(得分:5)
使用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))
答案 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))
我认为通过开始和结束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))