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

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

问题描述

我看过很多帖子(

我想要一个图形,其中 Z 轴在接近 0 时显示红色,在接近 1 时显示黄色.

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

有没有办法做到这一点?

df3d = 结构(列表(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 = 结构(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")库(scatterplot3d)#http://www.statmethods.net/graphs/scatterplot.html图书馆(rgl)图书馆(akima)sp= c("fortis","fuliginosa","magnirostris","scandens")open3d()par3d(windowRect = c(10, 10, 600, 600))plot3d(x = df3d$pc1,y = df3d$pc2,z = df3d$pcol=c("#FF3030","#9ACD31", "#1D90FF", "#FF8001")[(as.factor(df3d$sp))],xlab = "PC1",ylab = "PC2",zlab = "健身",类型 = "p",# size = round(as.numeric(df3d$z.mean)),main = "哟")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$p重复=条")z = s$z*2zlim <- 范围(df3d$phi)zlen <- zlim[2] - zlim[1] + 1colorlut <- 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$p重复=条")rbPal <- colorRampPalette(c('yellow','red'))nb.div = 10data.col =as.data.frame(matrix(as.factor(cut(s$z,breaks = nb.div)),暗淡(s$z)[1],暗淡(s$z)[2]))col.index=matrix(as.numeric(unlist(data.col)),暗淡(s$z)[1],暗淡(s$z)[2])Col <- rbPal(nb.div)[col.index]col=矩阵(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 = 范数(100)y = 范数(100)z1 = -x^2-y^2+x^3expit <- 函数(x) 1/(1+exp(-x))logit <- function(x) log(x/(1-x))z = 出口(z1+1)plot3d(x = x,y = y,z = z,col="红色",xlab = "PC1",ylab = "PC2",zlab = "健身",类型 = "p",# size = round(as.numeric(df3d$z.mean)),main = "哟")s = interp(x,是,z,重复=条")rbPal <- colorRampPalette(c('red','yellow'))nb.div = 10data.col = as.data.frame(matrix(as.factor(cut(s$z,breaks = nb.div)),暗淡(s$z)[1],暗淡(s$z)[2]))col.index = matrix(as.numeric(unlist(data.col)),暗淡(s$z)[1],暗淡(s$z)[2])Col <- rbPal(nb.div)[col.index]col=矩阵(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,正确 = 真,休息 = nb.div)),暗淡(s$z)[1],暗淡(s$z)[2],byrow = FALSE))范围 = 水平(cut(s$z,ordered_result = T,include.lowest = TRUE,正确 = 真,休息时间 = nb.div))图书馆(plyr)for(i in 1:ncol(data.col)){data.col[,i] <- mapvalues(data.col[,i],从=范围,to=rbPal(nb.div),警告丢失 = 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天全站免登陆