使用颜色渐变的R绘图

3
以下是使用R函数persp3d和指定颜色的3D曲线。
library(rgl)

y = seq(-5,25,by=0.1)
x = seq(5,20,by=0.2)

NAs <- rep(NA, length(x)*length(y))
z <- matrix(NAs, length(x), byrow = T)
for(i in seq(1,length(x))) {
    for(j in seq(1,length(y))) {
        val = x[i] * y[j]
        z[i,j] = val
        if(z[i,j] < 0.02) {
            z[i,j] = NA
        }

    }
}

col <- rainbow(length(x))[rank(x)]

open3d()
persp3d(x,y,z,color=col,xlim=c(5,20),ylim=c(5,10),axes=T,box=F,xlab="X Axis",ylab="Y Axis",zlab="Z Axis")

它生成以下图像:

在此输入图像描述

在当前版本中,对于x值为15,颜色是蓝色,无论z值是什么。但是,如果能使高z值呈深蓝色,而低z值呈浅蓝色,那就更好了,如果可以的话。如何做到这一点,使颜色不仅区分x值,而且还区分z值?

2个回答

5
您需要在HSV格式而不是RGB格式中调整颜色。我认为这样更容易。
请查看以下示例代码。
library(rgl)

y = seq(-5,25,by=0.1)
x = seq(5,20,by=0.2)

NAs <- rep(NA, length(x)*length(y))
z <- matrix(NAs, length(x), byrow = T)
for(i in seq(1,length(x))) {
  for(j in seq(1,length(y))) {
    val = x[i] * y[j]
    z[i,j] = val
    if(z[i,j] < 0.02) {
      z[i,j] = NA
    }

  }
}

为每个x值创建独特的颜色。
col <- rainbow(length(x))[rank(x)]

重复col length(y) 次以创建颜色网格。
col2 <- matrix(rep(col,length(y)), length(x))
for(k in 1:nrow(z)) {

  row <- z[k,]
  rowCol <- col2[k,]  
  rowRGB <- col2rgb(rowCol) #convert hex colors to RGB values
  rowHSV <- rgb2hsv(rowRGB) #convert RGB values to HSV values

  row[is.na(row)] <- 0
  v <- scale(row,center=min(row), scale=max(row)-min(row)) # scale z values to 0-1

  rowHSV['s',] <- v #update s or v values by our scaled values above
  # rowHSV['v',] <- v  # try changing either saturation or value i.e. either s or v

  newRowCol <- hsv(rowHSV['h',], rowHSV['s',], rowHSV['v', ]) #convert back to hex color codes
  col2[k,] <- newRowCol #Replace back in original color grid
}

open3d()
persp3d(x,y,z,color=col2,xlim=c(5,20),ylim=c(5,10),axes=T,box=F,xlab="X Axis",ylab="Y Axis",zlab="Z Axis")

这应该会产生以下效果。您可以尝试调整颜色的饱和度或值来获得所需的阴影的“明亮度”或“暗度”。

enter image description here


0

你只需要改变一行代码:

library(rgl)

y = seq(-5,25,by=0.1)
x = seq(5,20,by=0.2)

NAs <- rep(NA, length(x)*length(y))
z <- matrix(NAs, length(x), byrow = T)
for(i in seq(1,length(x))) {
    for(j in seq(1,length(y))) {
        val = x[i] * y[j]
        z[i,j] = val
        if(z[i,j] < 0.02) {
            z[i,j] = NA
        }
    }
}

col <- rainbow(length(z))[rank(z)] # This line changed

open3d()
persp3d(x,y,z,color=col,xlim=c(5,20),ylim=c(5,10),axes=T,box=F,xlab="X Axis",ylab="Y Axis",zlab="Z Axis")

这也是我一开始的想法,但问题提到需要用颜色来表示同时存在的x和z,x仍然使用原来的颜色,而z则在其上叠加阴影/饱和度。 - Marius
啊!我没看到那个。嗯...如果要使用颜色矩阵,这将会更加复杂。 - N8TRO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接