当Z轴介于0和1之间时,如何在R中的surface3d中添加渐变颜色 [英] How to add gradient color to a surface3d in R when Z axis is between 0 and 1

查看:102
本文介绍了当Z轴介于0和1之间时,如何在R中的surface3d中添加渐变颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看过很多帖子(



我想得到一个图形,其中Z轴在附近时显示红色0,当它接近1时为黄色。



另一个问题是我在Z轴上有一堆NA,因为我只定义了x和对应于这些点的y值。通常,人们使用 outer(x,y,f)来计算表面。我没有公式可以在其中插入数字。



有没有办法做到这一点?

  df3d = structure(list(phi = c(0.714779631270897,0.687691682891498,
0.596648688803568,0.573930669753368,0.742367142156744,0.647098819439728,
0.695488766544905、0.728284245613654、0.688278993976676、0.692076206940355,
0.721356887106184、0.551532807978921、0.54294513452377、0.529948458419129,
0.583705941140962、0.556086109758564、0.721770088612814、0.7112840958125、67932 $ b 0.539713252759555、0.696487636519962、0.709494568163841、0.537216639879562,
0.551801008711386、0.545341937291782、0.584139265723182、0.64967079561165,
0.562544215947123、0.716870075612315、0.523337825235807、0.588702763971338,
0.744644767844755、0.551489639273234、0.617165392352849、0.556723007149084,
0.66554863194508、0.570156474465965、0.59324644850682、0.552326531317577,
0.607405070778153、0.765602115588822、0.532910404322836、0.749202895901834834、0.542464978789945945 0.5940 $ 46925875725845825 0.598724220429779、0.704160605412078、0.709273655686999,b
0.57882815350951、0.80558646355475、0.739236441867173、0.556469513099474,
0.560730917777703、0.715514054617767、0.562095774851614、0.540152840905987,
0.561824376055758700700875570875570570587570875490570758450875570 0.529370104304623、0.756142990929929,
0.580486562475464、0.555099817471069、0.537232767721754、0.68405457472067,
0.572070245916932、0.73826438688156、0.776877621879421、0.5417182204358,
0.757617713719944、0.536922997394714、0.695880672257972、0.5708166297016480.7 0.676,
0.5398 0.744115961419341、0.568163711481982、0.631039420851915,
0.52569185852275、0.655488455712025、0.715875702650255、0.562828009151803,
0.565017441865273、0.554557230119741、0.641911755728664、0.549787832704858,
0.5222825295(4c)(结构) b $ b 1L,1L,2L,2L,2L,2L,4L,3L,2L,1L ,1L,1L,1L,1L,4L,4L,
1L,1L,2L,2L,1L,3L,2L,1L,1L,1L,1L,4L,1L,4L,1L,1L,
2L,1L,1L,1L,4L,1L,1L,1L,1L,2L,1L,2L,1L,1L,2L,2L,
1L,1L,4L,2L,1L,2L ,2L,1L,1L,2L,1L,1L,1L,1L,1L,1L,
2L,2L,1L,2L,1L,1L,1L,2L,1L,2L,2L,1L,2L ,1L,2L,1L,
1L,4L,2L,2L,1L,2L,1L,2L,1L,2L,4L,1L,1L,1L,1L,1L,
1L,1L ).Label = c( fortis, fuliginosa, magnirostris, scandens
),class = factor),pc1 = c(0.175880701440334,0.00718708371839084,
0.141108047117647,-0.0241407292755287,-0.362347619490667,-0.278187055817663,
-0.322472422874688,-0.342113759548994,-0.0480003258625717 0.4,
,-0.324560745197095,0.0893840127998557,0.392067958177292,
0.333197422567793,0.143274241985899,0.39728316736576,0.107258309440993,
0.172013966873444,0.198033002646736,0.0233433518931576,-0.379151278648175,
-0.360331402784382,0.0815105012533928,0.4916774405792,-0.325531606767521,
0.0464793855349116,0.128993599551295,0.0393187306328187,0.11649800088472,0.8382794449,8542 493178449 b 0.0866016090395172,-0.353101745830432、0.0903683502030376,-0.0766571214760896,
0.0189849871337894、0.0284234379094188,-0.074411018513597,-0.125981989564305,
-0.04066896524291、0.0513708917900996,-0.384362095569569、0.133461942504857,
-0.32950028028642,-0.0970510208736005、0.169708833257483,-0.3631537982489809 0.0874718551667044,
-0.286609834093365,0.247017305539772,-0.42431120384093,-0.323957076921413,
0.120304498088591、0.0372009683336541,-0.334862217128121、0.0850391283675992,
0.426550700956589、0.053540404847934、0.114569082118706、0.145035302093536,
0.462956587489796,-0.352558028645024,-0.370105398490897、0.249974349261847、0.249974349261847,$ 0.381 $ b -0.304611304484123、0.11736172451962,-0.35863773173462,-0.391035427221015,
0.219372693586083,-0.373985839773145、0.28640321397829,-0.319643095574694,
0.0125879234209831、0.182454650537706,-0.0307250825972499,-0.32490678343306,
-0.341204851832981、0.314073748792412,-0.364615463916348,-0.2676b24098679 ,0.0357411052061282,
0.295614964446489,-0.0145385512772513,-0.0451979384514853,
0.190115107687624、0.159441037623466、0.0550870424124392、0.0582226744080579
),pc2 = c(-1.01095247497725,-1.03868939268555,0.217310975677827,
0.0285247896165632,0.0526206694724207,0.029933782968998,0.0777356682984,679,06.96540.9654-970,2,637,06,000,0,697,367,0,4,6,7,6,7,6,7,7,77,000,7,7,6,7,7,77,000,7,7,6,7,7,7,7,7,7,0,7,7,7,7,7,7,7 ,
0.00827859255924409、0.112996963663788,-0.0395108234571918,
0.173676295351724、0.203897905654255,-0.936940800121312,-1.04245666692378,
0.171077913138838,-0.164692367490732、0.0227473300072106、0.108660664812142,
-0.0570692402038391、0.219114322364657,-0.00559526046181254,
-0.0904496365732674、0.0329879550738144,-0.0513100262471313,
b 0.157624496486177,-898-0.7898 b -0.151743057518861、0.153748243948929,-0.0290891308461303、0.00866038555153437,
0.131519041243216,-0.0113322871452352,-0.4873782282612 18,-0.0178833351102055,
0.0262770136476736,-0.0671756888678338、0.190653963041647、0.0874833382301275,
-0.0729306295513451,-0.114781088459982、0.176113469790657、0.229289749785351,
0.023115521362388、0.012411273100.6669-0.00629 ,-0.119025249254049、0.222273563398108、0.0949392931025451,
-0.103328613004053、0.0497069994557915、0.0169108098226666、0.0176907608810171,
0.0525638095222423、0.0991718002465503、0.031701514651561、0.194031271868605,
0.00563908525013029、0.144806228737922、0.145921630779316、0.164295633824383,
-0.0579825386055256、0.104068297238545、0.204915386707032 0.1538803713697455943 7955.9578359 ,0.0274014273919194,0.133609276043029,0.023767214013592,
0.0322573857202049,0.0409388634816843,0.064379943582668 6,-0.850272489901295,
0.0430623373727956,0.0213513249227984,0.112589167129505,0.0764778027855769,
-0.0187866951639582,0.0514999426382286,-0.141852017637047,
0.132798155087113,-0.811488800456735,0.18297353727076,0.00129211340539928,
-0.0604306388888919,0.39467615944551 ,0.0406033888777663,-0.0115831761153328,
-0.190035979057187)).names = c( phi, sp, pc1, pc2),row.names = c( phi [1245,12] ,
phi [1058,12], phi [594,12], phi [1999,12], phi [1546,12],
phi [353,12], phi [312,12], phi [21,12], phi [1371,12], phi [1874,12],
phi [384,12], phi [124,12], phi [2085,12], phi [163,12],
phi [221,12], phi [1321,12], phi [ 1767,12], phi [1883,12],
phi [490,12], phi [225,12], phi [1719,12], phi [1613,12],
phi [268,12], phi [2132,12], phi [1458,12], phi [1173,12],
phi [1335,12], phi [1357,12], phi [388,12], phi [985,12],
phi [184,12], phi [945,12], phi [2143,12], phi [ 1273,12],
phi [1738,12], phi [2081,12], phi [822,12], phi [1236,12],
phi [2044,12], phi [2018,12], phi [1065,12], phi [314,12],
phi [943,12], phi [514,12], phi [448,12], phi [1535,12],
phi [1798,12], phi [960,12], phi [22,12], phi [ 128,12], phi [190,12],
phi [2037,12], phi [772,12], phi [1553,12], phi [417,12],
phi [1659,12], phi [1529,12], phi [1369,12], phi [2075,12],
phi [1722,12], phi [712,12], phi [80,12], phi [1050,12],
phi [1877,12], phi [1195,12], phi [1138,12], phi [ 1549,12],
phi [1886,12], phi [9 0,12], phi [1990,12], phi [423,12],
phi [783,12], phi [165,12], phi [1975 ,12], phi [951,12],
phi [1681,12], phi [1647,12], phi [1286,12], phi [1666, 12],
phi [1029,12], phi [1989,12], phi [668,12], phi [1859,12],
phi [763,12], phi [879,12], phi [1639,12], phi [839,12],
phi [1366,12], phi [731,12], phi [34,12], phi [250,12], phi [25,12],
phi [457,12], phi [465,12], phi [1010,12], phi [1388,12],
phi [2055,12] , phi [917,12], phi [188,12], phi [130,12]),class = data.frame)

库(scatterplot3d) #http://www.statmethods.net/graphs/scatterplot.html
库(rgl)
库(akima)

sp = c( fortis, fuliginosa , magnirostris, scandens)

open3d()
par3d(windowRect = c(10,10,60 0,600))

plot3d(x = df3d $ pc1,
y = df3d $ pc2,
z = df3d $ phi,
col = c(#FF3030 ,#9ACD31,#1D90FF,#FF8001)[(as.factor(df3d $ sp))],
xlab = PC1,
ylab = PC2,
zlab =健身,
类型= p,
#大小=圆形(as.numeric(df3d $ z.mean)),
main = yo )

for(j in 1:length(sp)){
df3d.sp = df3d [df3d $ sp == sp [j],]
if(nrow( df3d.sp)== 1){next} else {

s = interp(df3d.sp $ pc1,
df3d.sp $ pc2,
df3d.sp $ phi,
plicate = strip)

z = s $ z * 2
zlim<-range(df3d $ phi)
zlen<-zlim [2] -zlim [1] + 1

colorlut<-heat.colors(zlen)#高度颜色查询表

col<-colorlut [z-zlim [1] +1]#为每个点的高度分配颜色

surface3d(s $ x,s $ y,s $ z,color = col,alpha = 0.5)
}
}

我能做的最好的事情是这样的:

  for(j in 1:length(sp )){
df3d.sp = df3d [df3d $ sp == sp [j],]
if(nrow(df3d.sp)== 1){next} else {

s = interp(df3d.sp $ pc1,
df3d.sp $ pc2,
df3d.sp $ phi,
复制= strip)

rbPal<-colorRampPalette(c('yellow','red'))
nb.div = 10
data.col = as.data.frame(matrix(as.factor(cut(s $ z,breaks = nb.div)),
dim(s $ z)[1],dim(s $ z)[2]))
col.index = matrix(as.numeric(unlist) (data.col)),
dim(s $ z)[1],dim(s $ z)[2])

Col <-rbPal(nb.div)[ col.index]
col = matrix(Col,dim(s $ z)[1],dim(s $ z)[2])
surface3d(s $ x,s $ y,s $ z,color = col,alpha = 0.5)
}
}

问题在于颜色不是从红色变为黄色(0-> 1)。它们是随机关联的:





此外,颜色不限于介于0和1之间。



我该怎么做?



我已经刚尝试了一个新代码,它似乎可以工作,但是不能使用我拥有的数据。

 库(scatterplot3d)
库(rgl)
库(akima)

x = rnorm(100)
y = rnorm(100)
z1 = -x ^ 2-y ^ 2 + x ^ 3
expit<-函数(x)1 /(1 + exp(-x))
logit<-函数(x)log(x /(1-x))
z = expit(z1 + 1)

plot3d( x = x,
y = y,
z = z,
col = red,
xlab = PC1,
ylab = PC2,
zlab =健身,
类型= p,
#大小=圆形(as.numeric(df3d $ z.mean)),
main = yo)
s = interp(x,
y,
z,
复制= strip)

rbPal<-colorRampPalette(c('red','yellow '))
nb.div = 10
data.col = as.data.frame(matrix(as.factor(cut(s $ z,breaks = nb.div))),
dim(s $ z)[1],dim(s $ z)[2]))
col.index = matrix(as.numeric(unlist(data.col)),
dim(s $ z)[1],dim(s $ z)[2])

Col <-rbPal(nb.div)[col.index]
col = matrix(Col,dim(s $ z)[1],dim(s $ z)[2])

surface3d(s $ x,s $ y,s $ z,color = col ,alpha = 1)



那为什么会起作用?

解决方案

我找到了答案。我需要订购切割值,然后用颜色重新映射范围的值。不优雅,但是可以工作...

  data.col = as.data.frame(matrix(as.factor(cut( s $ z,ordered_result = T,
include.lowest = TRUE,
right = TRUE,
breaks = nb.div)),
dim(s $ z)[1 ],
dim(s $ z)[2],借位= FALSE))

范围=水平(cut(s $ z,ordered_result = T,
include.lowest = TRUE,
right = TRUE,
breaks = nb.div))
库(plyr)
for(i in 1:ncol(data.col)){
data.col [,i]<-mapvalues(data.col [,i],
from = range,
to = rbPal(nb.div),
warn_missing = FALSE )

}


I've seen many posts (here, here, here, and here) on how to add color gradient on the Z axis (but none on "z" values that range from 0 to 1). The only thing is that when I do this, I end up with only two colors if my data on the Z axis is between 0 and 1.

Here is an example:

I would like to have a figure where the Z axis is show a red color when it's near 0 and yellow when it's near 1.

The other problem is that I have a bunch of NA's in the Z axis because I'm defining the surface for only the x and y values that correspond to the points. Usually, people use "outer(x,y,f)" to compute the surface. I don't have an equation where I can just plug the numbers.

Is there a way that I can do this?

df3d = structure(list(phi = c(0.714779631270897, 0.687691682891498, 
                              0.596648688803568, 0.573930669753368, 0.742367142156744, 0.647098819439728, 
                              0.695488766544905, 0.728284245613654, 0.688278993976676, 0.692076206940355, 
                              0.721356887106184, 0.551532807978921, 0.54294513452377, 0.529948458419129, 
                              0.583705941140962, 0.556086109758564, 0.721770088612814, 0.711284095827769, 
                              0.573741332655988, 0.527342613188125, 0.762709309318822, 0.740228675759072, 
                              0.539713252759555, 0.696487636519962, 0.709494568163841, 0.537216639879562, 
                              0.551801008711386, 0.545341937291782, 0.584139265723182, 0.64967079561165, 
                              0.562544215947123, 0.716870075612315, 0.523337825235807, 0.588702763971338, 
                              0.744644767844755, 0.551489639273234, 0.617165392352849, 0.556723007149084, 
                              0.66554863194508, 0.570156474465965, 0.59324644850682, 0.552326531317577, 
                              0.607405070778153, 0.765602115588822, 0.532910404322836, 0.749202895901834, 
                              0.638084894011913, 0.594508381800896, 0.745877525852658, 0.742265176757939, 
                              0.55200104972317, 0.598724220429779, 0.704160605412078, 0.709273655686999, 
                              0.57882815350951, 0.80558646355475, 0.739236441867173, 0.556469513099474, 
                              0.560730917777703, 0.715514054617767, 0.562095774851614, 0.540152840905987, 
                              0.561824376055385, 0.595049050758879, 0.544700858333275, 0.54379044778355, 
                              0.735023707587803, 0.75761987117526, 0.529370104304623, 0.756142990929929, 
                              0.580486562475464, 0.555099817471069, 0.537232767721754, 0.68405457472067, 
                              0.572070245916932, 0.73826438688156, 0.776877621879421, 0.5417182204358, 
                              0.757617713719944, 0.536922997394714, 0.695880672257972, 0.570816629701256, 
                              0.551885077056955, 0.697426644089613, 0.700677930911186, 0.722074526398648, 
                              0.547841598427244, 0.744115961419341, 0.568163711481982, 0.631039420851915, 
                              0.52569185852275, 0.655488455712025, 0.715875702650255, 0.562828009151803, 
                              0.565017441865273, 0.554557230119741, 0.641911755728664, 0.549787832704858, 
                              0.551682550480448, 0.522229525069209), sp = structure(c(4L, 4L, 
                                                                                      1L, 1L, 2L, 2L, 2L, 2L, 4L, 3L, 2L, 1L, 1L, 1L, 1L, 1L, 4L, 4L, 
                                                                                      1L, 1L, 2L, 2L, 1L, 3L, 2L, 1L, 1L, 1L, 1L, 4L, 1L, 4L, 1L, 1L, 
                                                                                      2L, 1L, 1L, 1L, 4L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 
                                                                                      1L, 1L, 4L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                                                                      2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 
                                                                                      1L, 4L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 4L, 1L, 1L, 1L, 1L, 1L, 
                                                                                      1L, 1L), .Label = c("fortis", "fuliginosa", "magnirostris", "scandens"
                                                                                      ), class = "factor"), pc1 = c(0.175880701440334, 0.00718708371839084, 
                                                                                                                    0.141108047117647, -0.0241407292755287, -0.362347619490667, -0.278187055817663, 
                                                                                                                    -0.322472422874688, -0.342113759548994, -0.0480003258625404, 
                                                                                                                    0.471768235224601, -0.324560745197095, 0.0893840127998557, 0.392067958177292, 
                                                                                                                    0.333197422567793, 0.143274241985899, 0.39728316736576, 0.107258309440993, 
                                                                                                                    0.172013966873444, 0.198033002646736, 0.0233433518931576, -0.379151278648175, 
                                                                                                                    -0.360331402784382, 0.0815105012533928, 0.4916774405792, -0.325531606767521, 
                                                                                                                    0.0464793855349116, 0.128993599551295, 0.0393187306328187, 0.116498023384732, 
                                                                                                                    0.0585444918583008, 0.0519773823187942, 0.117485670789894, 0.141592582273004, 
                                                                                                                    0.0866016090395172, -0.353101745830432, 0.0903683502030376, -0.0766571214760896, 
                                                                                                                    0.0189849871337894, 0.0284234379094188, -0.074411018513597, -0.125981989564305, 
                                                                                                                    -0.04066896524291, 0.0513708917900996, -0.384362095569569, 0.133461942504857, 
                                                                                                                    -0.32950028028642, -0.0970510208736005, 0.169708833257483, -0.363153793934809, 
                                                                                                                    -0.358442393985438, 0.0823660510982192, 0.14891498101178, 0.0874718551667044, 
                                                                                                                    -0.286609834093365, 0.247017305539772, -0.42431120384093, -0.323957076921413, 
                                                                                                                    0.120304498088591, 0.0372009683336541, -0.334862217128121, 0.0850391283675992, 
                                                                                                                    0.426550700956589, 0.053540404847934, 0.114569082118706, 0.145035302093536, 
                                                                                                                    0.462956587489796, -0.352558028645024, -0.370105398490897, 0.249974349261361, 
                                                                                                                    -0.374913268845847, 0.209780781689884, 0.313250151589845, 0.46260008422501, 
                                                                                                                    -0.304611304484123, 0.11736172451962, -0.35863773173462, -0.391035427221015, 
                                                                                                                    0.219372693586083, -0.373985839773145, 0.28640321397829, -0.319643095574694, 
                                                                                                                    0.0125879234209831, 0.182454650537706, -0.0307250825972499, -0.32490678343306, 
                                                                                                                    -0.341204851832981, 0.314073748792412, -0.364615463916348, -0.0644240574912661, 
                                                                                                                    -0.267640246495039, 0.10370599000585, -0.288131406123636, 0.0357411052061282, 
                                                                                                                    0.295614964446489, -0.0145385512772513, -0.0451979384514853, 
                                                                                                                    0.190115107687624, 0.159441037623466, 0.0550870424124392, 0.0582226744080579
                                                                                      ), pc2 = c(-1.01095247497725, -1.03868939268555, 0.217310975677827, 
                                                                                                 0.0285247896165632, 0.0526206694724207, 0.029933782968998, 0.0777356682984891, 
                                                                                                 0.178400497047045, -0.895131692154304, 0.209867904648101, -0.0527418216237663, 
                                                                                                 0.00827859255924409, 0.112996963663788, -0.0395108234571918, 
                                                                                                 0.173676295351724, 0.203897905654255, -0.936940800121312, -1.04245666692378, 
                                                                                                 0.171077913138838, -0.164692367490732, 0.0227473300072106, 0.108660664812142, 
                                                                                                 -0.0570692402038391, 0.219114322364657, -0.00559526046181254, 
                                                                                                 -0.0904496365732674, 0.0329879550738144, -0.0513100262471313, 
                                                                                                 0.157624496486177, -0.430836781866961, 0.0336830138484876, -0.997472053889813, 
                                                                                                 -0.151743057518861, 0.153748243948929, -0.0290891308461303, 0.00866038555153437, 
                                                                                                 0.131519041243216, -0.0113322871452352, -0.487378228261218, -0.0178833351102055, 
                                                                                                 0.0262770136476736, -0.0671756888678338, 0.190653963041647, 0.0874833382301275, 
                                                                                                 -0.0729306295513451, -0.114781088459982, 0.176113469790657, 0.229289749785351, 
                                                                                                 0.023115521362388, 0.0124139031005011, 0.00629127323542669, 0.229545586035766, 
                                                                                                 -0.643425633985522, -0.119025249254049, 0.222273563398108, 0.0949392931025451, 
                                                                                                 -0.103328613004053, 0.0497069994557915, 0.0169108098226666, 0.0176907608810171, 
                                                                                                 0.0525638095222423, 0.0991718002465503, 0.031701514651561, 0.194031271868605, 
                                                                                                 0.00563908525013029, 0.144806228737922, 0.145921630779316, 0.164295633824383, 
                                                                                                 -0.0579825386055256, 0.104068297238545, 0.204915386707032, 0.153880371324229, 
                                                                                                 0.0676594796683301, 0.183052585806673, 0.113255499327757, 0.107866805397445, 
                                                                                                 0.142039558115177, 0.0274014273919194, 0.133609276043029, 0.023767214013592, 
                                                                                                 0.0322573857202049, 0.0409388634816843, 0.0643799435826686, -0.850272489901295, 
                                                                                                 0.0430623373727956, 0.0213513249227984, 0.112589167129505, 0.0764778027855769, 
                                                                                                 -0.0187866951639582, 0.0514999426382286, -0.141852017637047, 
                                                                                                 0.132798155087113, -0.811488800456735, 0.18297353727076, 0.00129211340539928, 
                                                                                                 -0.0604306388888919, 0.39467615944551, 0.0406033888777663, -0.0115831761153328, 
                                                                                                 -0.190035979057187)), .Names = c("phi", "sp", "pc1", "pc2"), row.names = c("phi[1245,12]", 
                                                                                                                                                                            "phi[1058,12]", "phi[594,12]", "phi[1999,12]", "phi[1546,12]", 
                                                                                                                                                                            "phi[353,12]", "phi[312,12]", "phi[21,12]", "phi[1371,12]", "phi[1874,12]", 
                                                                                                                                                                            "phi[384,12]", "phi[124,12]", "phi[2085,12]", "phi[163,12]", 
                                                                                                                                                                            "phi[221,12]", "phi[1321,12]", "phi[1767,12]", "phi[1883,12]", 
                                                                                                                                                                            "phi[490,12]", "phi[225,12]", "phi[1719,12]", "phi[1613,12]", 
                                                                                                                                                                            "phi[268,12]", "phi[2132,12]", "phi[1458,12]", "phi[1173,12]", 
                                                                                                                                                                            "phi[1335,12]", "phi[1357,12]", "phi[388,12]", "phi[985,12]", 
                                                                                                                                                                            "phi[184,12]", "phi[945,12]", "phi[2143,12]", "phi[1273,12]", 
                                                                                                                                                                            "phi[1738,12]", "phi[2081,12]", "phi[822,12]", "phi[1236,12]", 
                                                                                                                                                                            "phi[2044,12]", "phi[2018,12]", "phi[1065,12]", "phi[314,12]", 
                                                                                                                                                                            "phi[943,12]", "phi[514,12]", "phi[448,12]", "phi[1535,12]", 
                                                                                                                                                                            "phi[1798,12]", "phi[960,12]", "phi[22,12]", "phi[128,12]", "phi[190,12]", 
                                                                                                                                                                            "phi[2037,12]", "phi[772,12]", "phi[1553,12]", "phi[417,12]", 
                                                                                                                                                                            "phi[1659,12]", "phi[1529,12]", "phi[1369,12]", "phi[2075,12]", 
                                                                                                                                                                            "phi[1722,12]", "phi[712,12]", "phi[80,12]", "phi[1050,12]", 
                                                                                                                                                                            "phi[1877,12]", "phi[1195,12]", "phi[1138,12]", "phi[1549,12]", 
                                                                                                                                                                            "phi[1886,12]", "phi[90,12]", "phi[1990,12]", "phi[423,12]", 
                                                                                                                                                                            "phi[783,12]", "phi[165,12]", "phi[1975,12]", "phi[951,12]", 
                                                                                                                                                                            "phi[1681,12]", "phi[1647,12]", "phi[1286,12]", "phi[1666,12]", 
                                                                                                                                                                            "phi[1029,12]", "phi[1989,12]", "phi[668,12]", "phi[1859,12]", 
                                                                                                                                                                            "phi[763,12]", "phi[879,12]", "phi[1639,12]", "phi[839,12]", 
                                                                                                                                                                            "phi[1366,12]", "phi[731,12]", "phi[34,12]", "phi[250,12]", "phi[25,12]", 
                                                                                                                                                                            "phi[457,12]", "phi[465,12]", "phi[1010,12]", "phi[1388,12]", 
                                                                                                                                                                            "phi[2055,12]", "phi[917,12]", "phi[188,12]", "phi[130,12]"), class = "data.frame")

library(scatterplot3d) #http://www.statmethods.net/graphs/scatterplot.html
library(rgl)
library(akima)

sp= c("fortis","fuliginosa","magnirostris","scandens")

open3d()
par3d(windowRect = c(10, 10, 600, 600))

plot3d(x = df3d$pc1,
       y = df3d$pc2,
       z = df3d$phi, 
       col=c("#FF3030","#9ACD31",  "#1D90FF",  "#FF8001")[(as.factor(df3d$sp))],
       xlab = "PC1",
       ylab = "PC2",
       zlab = "Fitness",
       type = "p",
       # size = round(as.numeric(df3d$z.mean)), 
       main = "yo")

for(j in 1:length(sp)){
  df3d.sp = df3d[df3d$sp == sp[j],]
  if(nrow(df3d.sp) == 1){next} else{

    s = interp(df3d.sp$pc1,
               df3d.sp$pc2,
               df3d.sp$phi,
               duplicate="strip")

    z = s$z*2
    zlim <- range(df3d$phi)
    zlen <- zlim[2] - zlim[1] + 1

    colorlut <- heat.colors(zlen) # height color lookup table

    col <- colorlut[ z-zlim[1]+1 ] # assign colors to heights for each point

    surface3d(s$x,s$y,s$z,color=col, alpha = 0.5)
  }
}

The best I could do is something like this:

for(j in 1:length(sp)){
    df3d.sp = df3d[df3d$sp == sp[j],]
    if(nrow(df3d.sp) == 1){next} else{

      s = interp(df3d.sp$pc1,
                 df3d.sp$pc2,
                 df3d.sp$phi,
                 duplicate="strip")

      rbPal <- colorRampPalette(c('yellow','red'))
      nb.div = 10
      data.col =as.data.frame(matrix(as.factor(cut(s$z,breaks = nb.div)),
                                     dim(s$z)[1],dim(s$z)[2]))
      col.index=matrix(as.numeric(unlist(data.col)),
            dim(s$z)[1],dim(s$z)[2])

      Col <- rbPal(nb.div)[col.index]
      col= matrix(Col,dim(s$z)[1],dim(s$z)[2])
      surface3d(s$x,s$y,s$z,color=col, alpha = 0.5)
    }
  }

The problem is that the colors are not going from red to yellow (0->1). They are randomly associated:

Also, the colors are not constrained to be between 0 and 1.

How could I do this?

I've just tried a new code and it seems to work, but not with the data that I have.

library(scatterplot3d) 
library(rgl)
library(akima)

x = rnorm(100)
y = rnorm(100)
z1 = -x^2-y^2+x^3
expit <- function(x) 1/(1+exp(-x))
logit <- function(x) log(x/(1-x))
z = expit(z1+1)

plot3d(x = x,
       y = y,
       z = z, 
       col="red",
       xlab = "PC1",
       ylab = "PC2",
       zlab = "Fitness",
       type = "p",
       # size = round(as.numeric(df3d$z.mean)), 
       main = "yo")
s = interp(x,
           y,
           z,
           duplicate="strip")

rbPal <- colorRampPalette(c('red','yellow'))
nb.div = 10
data.col = as.data.frame(matrix(as.factor(cut(s$z, breaks = nb.div)),
                                dim(s$z)[1],dim(s$z)[2]))
col.index = matrix(as.numeric(unlist(data.col)),
                   dim(s$z)[1],dim(s$z)[2])

Col <- rbPal(nb.div)[col.index]
col= matrix(Col, dim(s$z)[1], dim(s$z)[2])

surface3d(s$x,s$y,s$z,color=col, alpha = 1)

Why would that one work?

解决方案

I found the answer. I needed to order the cut values and then remap the values of the range with the colors. Not elegant, but working...

 data.col = as.data.frame(matrix(as.factor(cut(s$z,ordered_result = T,
                                                    include.lowest = TRUE,
                                                    right = TRUE, 
                                                    breaks = nb.div)),
                                      dim(s$z)[1],
                                      dim(s$z)[2],byrow = FALSE))

      range = levels(cut(s$z,ordered_result = T,
                         include.lowest = TRUE,
                         right = TRUE, 
                         breaks = nb.div))
      library(plyr)
      for(i in 1:ncol(data.col)){
        data.col[,i] <- mapvalues(data.col[,i], 
                                  from=range, 
                                  to=rbPal(nb.div), 
                                  warn_missing = FALSE)

      }

这篇关于当Z轴介于0和1之间时,如何在R中的surface3d中添加渐变颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆