R语言plotly绘图点与原始数据不匹配及悬停文本修改咨询
问题原因分析
- 网格数据构造错误:你当前用
data.frame(input_1, input_2, input_3, input_4)生成的是101行的长表,每一行的四个输入值完全相等(都是i,i,i,i,i从0到100),并不是三维空间的全量网格点。如果你要生成三维坐标的全排列网格,应该用expand.grid()而非直接合并等长向量。 - 绘图参数逻辑错误:你同时叠加了
add_trace(type='mesh3d')和add_surface()两个图层,且add_surface()中直接将整个my_grid数据框转为矩阵作为z轴输入,my_grid包含4个输入列+1个结果列共5列数值,因此z轴的实际取值是整表所有数值的集合,远超出你以为的input_3的0-100范围。同时你将surfacecolor设为整个my_grid而非final_value列,颜色映射逻辑也不符合你的预期。 - 理解存在偏差:你默认z轴对应input_3,但上述参数设置错误的情况下,你看到的200.356的z值本质是
final_value的计算结果(input_3+input_4最大为200,加上三角函数的偏移刚好落在这个区间),自然无法在input_3的取值范围里找到对应记录。 - 3D绘图的插值特性:plotly的表面类图层在渲染时会对输入的离散点做自动插值平滑,生成连续的表面,这些插值得到的中间点本身就不存在于原始数据集中。
修正方案与自定义悬停文本
你有4个输入变量,属于四维数据,若要在3D图中展示,需要先固定其中一个输入变量的取值,再生成剩下三个变量的全排列网格计算结果。以下是修正后的代码,同时自定义了悬停文本:
library(plotly) library(dplyr) set.seed(123) # 固定input_4的取值为50(可按需调整) input_4_fixed <- 50 # 生成input_1、input_2、input_3的全排列网格 my_grid <- expand.grid( input_1 = seq(0,100,5), # 步长调大为5避免数据量过大导致卡顿 input_2 = seq(0,100,5), input_3 = seq(0,100,5) ) %>% mutate( input_4 = input_4_fixed, final_value = sin(input_1) + cos(input_2) + input_3 + input_4 ) # 绘图并自定义悬停文本 plot_ly() %>% add_trace( data = my_grid, x = ~input_1, y = ~input_2, z = ~input_3, type = 'mesh3d', intensity = ~final_value, # 按final_value映射颜色 hovertext = ~paste0( "input_1: ", input_1, "<br>", "input_2: ", input_2, "<br>", "input_3: ", input_3, "<br>", "input_4: ", input_4, "<br>", "final_value: ", round(final_value,3) ), hovertemplate = "%{hovertext}<extra></extra>" # 隐藏默认额外信息 )
你可以根据需求调整固定的变量、网格步长,若要保留surface图层,对应调整add_surface()的z、surfacecolor和悬停参数即可。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

