【问题标题】:How to color RGL surface3d based on positive/negative values?如何根据正/负值为 RGL surface3d 着色?
【发布时间】:2016-05-22 14:40:59
【问题描述】:

我有这段代码:(我在stackoverflow的某个地方找到了,只是用它来说明我的想法。)

x<-runif(20) 
y<-runif(20) 
z<-runif(20, -5,5) 

library(rgl) 
plot3d(x,y,z)

fit <- lm(z ~ poly(x,2) +poly(y,2) + x:y )

xnew <- seq(min(x), max(x), len=20) 
ynew <- seq(min(y), max(y), len=20) 
df <- expand.grid(x = xnew, 
                  y = ynew) 

df$z <- predict(fit, newdata=df)

surface3d(xnew, ynew, df$z, col="red")

我的问题是,如何使颜色成为零以上的绿色渐变和零以下的红色渐变?我说清楚了吗?

我发现了这个帖子:Formatting of persp3d plot

这有助于进行渐变,但我无法弄清楚如何使其依赖于 z 的正/负值,以及如何将其分别限制为绿色和红色。

感谢您的帮助!

编辑:

我尝试在下面做一些事情,添加以下内容:

colors<-rep("red", length(df$z))
colors[(df$z > 0)] <- colorRampPalette(c("yellow","green"))(sum(df$z > 0))
colors[(df$z < 0)] <- colorRampPalette(c("red","yellow"))(sum(df$z < 0))

surface3d(xnew, ynew, df$z, col=colors)

这是由谁制作的:

看起来渐变沿着错误的轴。在 z = 0 附近它应该是黄色的,随着 z 变得更负,它变得更红,随着 z 变得更正,它变得更绿。但它并没有这样做,而是沿 y 轴应用渐变(看似)。

想法?

【问题讨论】:

    标签: r rgl


    【解决方案1】:

    您可以使用针对 0 进行测试的 z 值返回一个由 1 和 0 组成的向量(然后通过 1+-操作强制转换为 2 和 1):

    surface3d(xnew, ynew, df$z, col=c("red","blue")[1+(df$z > 0)] )
    rgl.snapshot("zerocol.png",top=FALSE)
    

    您确实会在颜色阈值处看到相当多的锯齿,因为您的网格相当粗糙。我看到我使用颜色的方式与请求的方式略有不同,但原则是将颜色名称按 FALSE-z 第一和 TRUE-z 第二的顺序 (1+TRUE == 2)。很酷的马鞍适合我的随机抽奖。

    【讨论】:

    • 谢谢!我正在使用这个,但仍在尝试找出渐变。
    • 你的意思是阈值附近颜色的模糊混合?如果我稍微旋转一下,似乎边界在阈值处变成了阶跃函数。
    • 不,抱歉。我的意思是从红色(最负面)到黄色(0)的逐渐过渡,另一个从黄色(0)到绿色(最正面)的过渡。这有意义吗?
    • 查看边界时的 3d 旋转在阈值处变成了阶跃函数,这让我觉得平面上精美的照明效果正在改变明显的颜色(色调?)。您可以尝试看看 RGL 照明功能是否可以减少模糊。
    【解决方案2】:

    这是一个类似的方法,它将突出显示绿色>0 和红色

    colors<-rep("red", length(df$z))
    colors[(df$z>0.0)]<-"green"
    surface3d(xnew, ynew, df$z, col=colors)
    

    用基色定义一个数组,改变元素的颜色>0,然后绘图。

    编辑:要添加渐变,请查看 rgl.surface 命令的代码示例。这可能更接近您正在寻找的东西:

    zlenpos<- max(df$z)+1
    zlenneg<- 0-min(df$z)
    colorscale<-rainbow(zlenpos+zlenneg, start = 0, end = 2/6)
    colors<-colorscale[df$z - min(df$z) + 1]
    surface3d(xnew, ynew, df$z, col=colors)
    

    这执行从红色到黄色到绿色的渐变,但黄色接近 z 的零。我将把这个留给其他人来完善细节。

    【讨论】:

    • 我尝试了一些类似的方法。我在上面编辑过。
    • 见我上面的编辑。它更接近您的最终解决方案。
    • 这行得通,但渐变不是以零为中心(黄色)。不过,非常感谢您的帮助。这是一个非常需要的推动力。我会继续努力的。
    【解决方案3】:

    如果您的表面被指定为 x 和 y 的函数而不是矩阵,您可以使用persp3d.function 方法:它会根据 z 值自动计算出适当的颜色。请参阅?persp3d.function 中的第一个示例。

    如果您的 z 是一个矩阵,您将不得不复制 persp3d.function 所做的事情。您可以使用rgl:::persp3d.function 查看源代码。

    通常对于像这样的高级事物,您需要使用persp3dsurface3d 进行表面的低级绘图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-08
      • 2017-06-03
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 2022-12-03
      • 2016-03-03
      相关资源
      最近更新 更多