【发布时间】:2017-03-22 21:45:51
【问题描述】:
我第一次通过 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
刚刚返回:
理想的结果是将房屋区域的景观染成棕褐色,并在远离房屋的区域逐渐褪色为蓝色。
related question 使用了在其他地方找到的 mesh3d 代码,并没有解释如何计算 (i, j, k)
【问题讨论】: