2012-10-22 138 views
4

我想弄清楚是否有一种方法只能为使用grid.circle创建的一半圆圈着色。指定区域的颜色?

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

我想让上半部分变成蓝色,下半部分变成白色。

谢谢你的帮助!

+0

用什么语言是你的工作? – alestanis

+0

另请参阅http://stackoverflow.com/questions/12794596/how-fill-part-of-a-circle-using-ggplot2/12800110#12800110 –

回答

5

使用grid.polygon()和一些基本的三角,您可以定义会做到这一点

一些挑剔的护理需要采取这样当视口为非正方填充半圆不被扭曲的功能。要以符合grid.circle()所用规则的方式完成此操作,我已将原点设置为"npc"个单位,并将圆半径设置为"snpc"个单位。 (欲了解更多关于"npc""snpc"的含义,见?unitvignette("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)) 

​​

+0

出色的工作。这吸引了和弦。一些简单的修改导致代码满足Rhelp约5年未填充的项目,即如何构建指定中心和半径的“排列”或“适合内部”圆弧。 http://markmail.org/search/?q=list%3Aorg.r-project.r-help+grid.curve+arc#query:list%3Aorg.r-project.r-help%20grid.curve%20arc +页:1 +中:7euwzo4gppfxnobx +状态:结果 –

+0

@DWin - 酷豆。我不得不说我自己对这个很自豪。另外,我对Paul Murrel出色的软件工艺的敬意也不断增长。 –

2

这是一个修改的约什的出色工作初稿,创造充满和弦:

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

enter image description here

我认为它是nee DS的进一步工作有点使它的开头和结尾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)) 

enter image description here

+0

向量化这可能也不错,所以对'filledArc()'(或'filledSemiCircle()')的单个调用可以使用x和y原点向量,在每个点处绘制相同的“符号”。 (不是你应该那样做 - 我当然懒得自己做; –

+0

同意。可能还应该允许大量参数用于'gpar()'边界和行宽,可能使用'...'或其他列表传递机制或'modifyList'。 –

+0

@ JoshO'Brien:我发了一封电子邮件,提到你在这个问题上的工作给Paul Murrell。 –