4

grid.circle を使用して作成した円の半分だけに色を付ける方法があるかどうかを調べようとしています。

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

上半分は青く、下半分は白のままにしたいです。

ご協力ありがとうございました!

4

2 に答える 2

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

ここに画像の説明を入力

于 2012-10-22T16:25:15.177 に答える
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))

ここに画像の説明を入力

シータの開始と終了によってパラメーター化するには、もう少し作業が必要だと思います(完了):

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

ここに画像の説明を入力

于 2012-10-22T17:59:59.837 に答える