使用Plotly的3D Surface函数绘图返回空白图的问题
Plotly 3D Surface绘图空白问题解决
我尝试用Plotly的3D Surface函数绘制生长速率数据,代码如下,但无论怎么格式化数据,生成的图表都是空白的——坐标轴标签正确,但数值有误,且看不到任何数据。
用户代码
library(plotly) library(htmlwidgets) data <- data.frame(Msp1) plot <- plot_ly(data = Msp1, x = ~Msp1$Pressure, y = ~Msp1$Salinity , z = ~Msp1$Growth.Rate, type = 'surface') htmlwidgets::saveWidget(plot, "test_plot.html") browseURL("test_plot.html")
数据示例
生长速率数据Msp1的示例如下:
| Pressure | Salinity | Growth Rate |
|---|---|---|
| 0 | 3 | 0.2 |
| 0 | 13 | 0.15 |
| 0 | 30 | 0.08 |
| 15 | 3 | 0.4 |
| 15 | 13 | 0.2 |
| 15 | 30 | 0.15 |
问题根源及解决办法
问题原因
Plotly的surface类型要求z参数必须是矩阵格式,而当前使用的是长格式(每行对应一个观测)的数据,Plotly无法识别出表面的网格结构,因此图表空白,坐标轴数值也出现错误。
解决步骤
- 将长格式数据转换为宽格式:使用
tidyr::pivot_wide把数据整理成以Pressure为行、Salinity为列、Growth Rate为值的结构,再转换为矩阵。 - 用整理后的矩阵和对应的x、y唯一值绘制3D表面图。
修改后的代码:
library(plotly) library(htmlwidgets) library(tidyr) # 转换数据为宽格式 Msp1_wide <- pivot_wide(Msp1, id_cols = Pressure, names_from = Salinity, values_from = `Growth Rate`) # 提取z矩阵(去掉Pressure列) z_matrix <- as.matrix(Msp1_wide[, -1]) # 给矩阵行命名,对应Pressure值 rownames(z_matrix) <- Msp1_wide$Pressure # 获取x和y轴的唯一值 x_vals <- unique(Msp1$Pressure) y_vals <- unique(Msp1$Salinity) # 绘制3D表面图,指定坐标轴标签 plot <- plot_ly(x = x_vals, y = y_vals, z = z_matrix, type = 'surface') %>% layout(scene = list( xaxis = list(title = "Pressure"), yaxis = list(title = "Salinity"), zaxis = list(title = "Growth Rate") )) htmlwidgets::saveWidget(plot, "test_plot.html") browseURL("test_plot.html")
补充说明
- 转换后的
z_matrix是2行3列的矩阵,完美对应Pressure的两个唯一值(0、15)和Salinity的三个唯一值(3、13、30)。 - 直接指定x、y为对应的唯一值,能确保坐标轴的数值显示正确。
内容的提问来源于stack exchange,提问作者marshmelow
相关产品推荐
相关产品推荐

