【问题标题】:Color a designated area?给指定区域着色?
【发布时间】:2012-10-22 15:53:57
【问题描述】:

我想弄清楚是否有一种方法可以只为我使用 grid.circle 创建的圆的一半着色。

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

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

感谢您的帮助!

【问题讨论】:

标签: r geometry


【解决方案1】:

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

【讨论】:

  • 出色的工作。这绘制了填充的和弦。一些简单的修改导致代码完成了 Rhelp 上大约 5 年未填充的项目,即如何构建“对齐”或“适合”指定中心和半径的圆的弧。 markmail.org/search/…
  • @DWin -- 酷豆。我不得不说我自己为这个感到骄傲。此外,我对 Paul Murrel 出色的软件工艺的敬意不断增长。
【解决方案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))

【讨论】:

  • 对它进行矢量化可能也不错,这样对filledArc()(或filledSemiCircle())的一次调用就可以采用x和y原点的向量,在每个点绘制相同的“符号” . (不是说你应该那样做——我自己肯定懒得做;)
  • 同意。可能还应该允许gpar() 为边框和线宽提供更多参数,可能使用... 或其他一些列表传递机制或modifyList
  • @JoshO'Brien:我向 Paul Murrell 发送了一封电子邮件,引用了您在这个问题上所做的工作。
猜你喜欢
  • 2016-11-20
  • 2021-02-06
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多