【发布时间】:2012-10-22 15:53:57
【问题描述】:
我想弄清楚是否有一种方法可以只为我使用 grid.circle 创建的圆的一半着色。
library(grid)
grid.circle(x=.5, y=.5, r=.25,gp=gpar(lwd=10))
我想让上半部变成蓝色,下半部留白。
感谢您的帮助!
【问题讨论】:
-
你用什么语言工作?
我想弄清楚是否有一种方法可以只为我使用 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))
我认为需要做一些进一步的工作才能通过开始和结束 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))
【讨论】:
filledArc()(或filledSemiCircle())的一次调用就可以采用x和y原点的向量,在每个点绘制相同的“符号” . (不是说你应该那样做——我自己肯定懒得做;)
gpar() 为边框和线宽提供更多参数,可能使用... 或其他一些列表传递机制或modifyList。