[英]R plot with color gradient
下面是使用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值?
您必須使用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")
這應該給予以下。 您可以圍繞飽和度或顏色值進行縮放,以獲得所需的“亮度”或“黑暗”色調。
你需要改變的只是一行:
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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.