Plotly 3D曲面图无法显示数据,代码是否存在问题?
解决Plotly 3D曲面图为空的问题
你的代码核心问题是Plotly的3D曲面图要求z是二维网格矩阵,但你现在把z转成了一维矩阵(本质还是单列向量),而且没有构建对应的x-y网格结构,所以曲面无法渲染出来。
解决步骤:
- 你的原始数据是散点格式(每个x、y对应一个z值),需要先把这些散点插值成网格化的数据(即每个x-y网格点都有对应的z值)
- 可以用
akima包的interp函数完成插值,先安装并加载这个包
修改后的代码:
library(plotly) library(akima) # 读取数据 Glaucoma_XYZ <- read.csv("~/Library/CloudStorage/SynologyDrive-Macbook/MSc Project/Glaucoma data XYZ CSV.csv") # 提取散点数据 x <- Glaucoma_XYZ$Presenting.MD..dB. y <- Glaucoma_XYZ$Rate.of.progression..dB.year. z <- Glaucoma_XYZ$Risk.of.vision.loss # 生成网格并插值(nx/ny控制网格密度,数值越大曲面越精细) interp_data <- interp(x = x, y = y, z = z, nx = 50, ny = 50) # 用插值后的网格数据绘制曲面图 plot <- plot_ly() %>% add_surface(z = interp_data$z, x = interp_data$x, y = interp_data$y) %>% layout( title = list(text = "Risk of vision loss based on rate of visual field progression", font = list(size = 12)), scene = list( xaxis = list( title = list(text = "Presenting MD (dB)", font = list(size = 8)), range = c(-24.5, 0.0) ), yaxis = list( title = list(text = "Rate of Progression (dB/year)", font = list(size = 8)), range = c(-5.0, -0.5) ), zaxis = list( title = list(text = "Risk of Vision Loss", font = list(size = 8)), range = c(0.0, 10.0) ) ) ) plot
关键说明:
interp函数会把散点x、y转换成均匀分布的网格坐标,同时对z值进行插值填充,生成符合曲面图要求的二维z矩阵- 如果你确认原始数据本身是网格格式(而非散点),可以直接将x、y、y整理成二维矩阵传入,但从你能正常绘制散点图的情况来看,插值是必要步骤
内容的提问来源于stack exchange,提问作者user23841248
相关产品推荐
相关产品推荐

