首页 > 解决方案 > 控制透视网格瓷砖边框颜色

问题描述

我在创建一个看起来完全符合我想要的样子的透视图时遇到了一些麻烦。特别是,我试图让网格根本不可见。如果您查看左侧的图像,您会看到瓷砖之间有微弱的线条。我希望它看起来像正确的图像,没有可见的线条:

在此处输入图像描述

我特别想要一个具有graphics::persp或其他基本 R 功能的解决方案。我对 3rd 方包不感兴趣rgl

我通过使用polygon和指定border颜色来匹配col颜色获得了权利。如果我离开border=NApolygon我会得到与 with 相同的结果persp。但是,它似乎persp只需要第一个边框值并重新使用它,polygon这与将颜色与多边形匹配不同。

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

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
)

标签: rgraphics

解决方案


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

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

带有抗锯齿的屏幕截图

默认情况下,但如果我打开图形设备使用

quartz(antialias = FALSE)

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

没有抗锯齿的截图

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

您可能可以通过使用抗锯齿绘制两次表面来使事情正常工作:第一次将显示边框,第二次可能仍会显示一些东西,但应该显示得更少。但是,persp()没有add = TRUE参数,所以第二次画东西可能会很棘手。

如果您不在 Mac 上,则需要阅读有关您正在使用的设备的信息,以了解它是否允许控制抗锯齿。

编辑添加:我尝试将 C 源代码修改persp为绘制表面 2 或 3 次的函数。绘制两次时边界仍然略微可见,但绘制 3 次后不可见。


推荐阅读