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))