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 値も区別できるようにするには、どうすればよいでしょうか?

4

2 に答える 2

5

これには、RGB 形式ではなく HSV 形式の色をいじる必要があります。そう思う方が楽です。

以下のサンプルコードを参照してください。

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")

これにより、次のようになります。彩度または色の値のスケーリングをいじって、希望する色合いの「明るさ」または「暗さ」を得ることができます。

ここに画像の説明を入力

于 2013-01-29T03:53:11.370 に答える
0

変更する必要があるのは、次の 1 行だけです。

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")
于 2013-01-29T01:35:18.857 に答える