我是第一次使用R中的Plotly,并且尝试从网格创建一个表面,并根据计算结果进行着色。
例如,我想使用data(volcano)
中的表面,如下所示:
library(plotly)
plot_ly(z = ~volcano) %>% add_surface()
但是,如果不是基于z值(高度)进行着色,假设我想要根据距离我的小台地上的房子(20,60)的距离进行着色。
house_loc <- c(20,60,150) # (x,y,z) of my house
dist_to_house <- Vectorize(function(x,y,z){sqrt(sum( (c(x,y,z)-house_loc)^2 ))})
到目前为止,我尝试过以下方法:
color_me <-function(x){
colorRampPalette(c('tan','blue')
)(24L)[findInterval(x,seq(0,1,length.out=25),
all.inside=TRUE)]
}
library(dplyr)
library(reshape2)
volcano %>%
melt( varnames=c('y','x'),value.name='z' ) %>%
mutate( d = dist_to_house(x, y, z) ,
d_rel = d/max(d),
d_color = color_me(d_rel)
) -> df
plot_ly(df,
type='scatter3d',
mode='none', # no markers, just surface
x=~x,
y=~y,
z=~z,
surfaceaxis=2,
surfacecolor=~d_color) # last argument seems not to work
只返回如下结果:
期望的结果是在房子周围的地区将景观涂成棕色,并逐渐向远离房子的地区褪色为蓝色。
一个有关问题的相关问题使用了从其他地方找到的mesh3d
代码,但没有解释如何计算(i, j, k)。