You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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的示例如下:

PressureSalinityGrowth Rate
030.2
0130.15
0300.08
1530.4
15130.2
15300.15

问题根源及解决办法

问题原因

Plotly的surface类型要求z参数必须是矩阵格式,而当前使用的是长格式(每行对应一个观测)的数据,Plotly无法识别出表面的网格结构,因此图表空白,坐标轴数值也出现错误。

解决步骤

  1. 将长格式数据转换为宽格式:使用tidyr::pivot_wide把数据整理成以Pressure为行、Salinity为列、Growth Rate为值的结构,再转换为矩阵。
  2. 用整理后的矩阵和对应的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:50:54