代码之家  ›  专栏  ›  技术社区  ›  BrodieG

控制persp网格瓷砖边框颜色

  •  0
  • BrodieG  · 技术社区  · 7 年前

    enter image description here

    我特别想要一个解决方案 graphics::persp 或其他基本R函数。我对像这样的第三方软件包不感兴趣 rgl

    我通过使用 polygon 以及指定 border col border=NA 多边形 persp . 然而,似乎 只需获取第一个边界值并重新使用它,不像 多边形 它将颜色与多边形匹配。

    这是用于生成图像的代码:

    nr <- nc <- 10
    mx <- matrix(numeric(nr * nc), nr)
    par(mai=numeric(4))
    col <- gray((row(mx[-1,-1]) * col(mx[-1,-1])/((nr-1)*(nc-1))))
    
    par(mfrow=c(1,3), mai=c(0, 0, .25, 0), pty='s')
    persp(
      mx, phi=90, theta=0, border=NA, col=col, r=1e9, zlim=c(0,1),
      axes=FALSE, box=FALSE
    )
    title('Persp border=NA')
    persp(
      mx, phi=90, theta=0, border=col, col=col, r=1e9, zlim=c(0,1),
      axes=FALSE, box=FALSE
    )
    title('Persp border=col')
    plot.new()
    
    mxpoly.x <- rbind(
      c(row(mx)[-nr, -nc]), c(row(mx)[-1, -nc]), c(row(mx)[-1, -1]),
      c(row(mx)[-nr, -1]), NA
    )
    mxpoly.y <- rbind(
      c(col(mx)[-nr, -nc]), c(col(mx)[-1, -nc]), c(col(mx)[-1, -1]),
      c(col(mx)[-nr, -1]), NA
    )
    title('Polygon')
    polygon(
      ((mxpoly.x - 1) / (max(mxpoly.x,na.rm=TRUE) - 1)),
      ((mxpoly.y - 1) / (max(mxpoly.y,na.rm=TRUE) - 1)),
      col=col, border=col
    )
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   user2554330    7 年前

    这看起来像是抗锯齿的结果。绘制每个单元格时,背景为白色,因此抗锯齿意味着边界像素以较浅的颜色绘制。

    在Mac电脑上,可以通过关闭抗锯齿功能来解决此问题。你的第一个例子给出了

    screenshot with antialiasing

    默认情况下,但如果我使用

    quartz(antialias = FALSE)
    

    然后运行相同的代码,我得到

    screenshot with no antialiasing

    关闭抗锯齿功能可能会导致锯齿状边缘,因此,如果有对角线,这可能不是解决实际问题的可接受解决方案。

    通过使用抗锯齿绘制两次曲面,您可能可以使事情正常进行:第一次将显示边框,第二次可能仍然显示某些内容,但应显示较少的内容。然而, persp() 没有 add = TRUE 所以第二次画东西可能会很棘手。

    如果你不在Mac电脑上,你需要阅读有关你正在使用的设备的信息,以确定它是否允许控制抗锯齿。

    编辑以添加:我尝试将C源代码修改为 persp 绘制曲面2或3次。边界仍然很小