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

如何在R语言Plotly的mesh3d图中添加网格线

如何在Plotly的mesh3d图中添加x/y轴网格线(线框样式)

问题背景

使用R语言Plotly包绘制mesh3d类型图时,surface图中有效的contours = list(y = list(show = TRUE), x = list(show = TRUE))参数在mesh3d中完全无效。由于mesh3d更便于追踪x、y变量,需要找到适配mesh3d的网格线实现方法。

可复现代码及对应效果:

library(plotly)
library(viridis)

# 定义数据
df1 <-data.frame(
  v1 = c(7000, 13000, 19000, 25000, 7000, 13000, 19000, 25000, 7000, 13000, 19000, 25000, 7000, 13000, 19000, 25000),
  v2 = c(10, 10, 10, 10, 66, 66, 66, 66, 178, 178, 178, 178, 312, 312, 312, 312),
  v3 = c(1200.123, 2500.567, 2400.789, 2300.456, 1650.789, 3700.123, 4200.345, 4300.567, 3300.456, 4000.789, 6800.123, 7810.345, 2300.789, 4200.567, 4900.123, 5200.567))

# Surface图(带网格线)
Matrix <- xtabs(df1$v3 ~ df1$v1 + df1$v2)
plot_ly(z=~Matrix,
        type = "surface", opacity = .45,
        contours = list(y = list(show = TRUE),
                        x = list(show = TRUE)))

Surface图效果:
带网格线的Surface图

# mesh3d图(无网格线,contours参数无效)
plot_ly(z = df1$v3, x = df1$v1, y = df1$v2,
        type = "mesh3d", opacity = .45,
        colorscale = "Viridis", intensity = df1$v3,
        contours = list(y = list(show = TRUE),
                        x = list(show = TRUE)))

mesh3d图效果:
无网格线的mesh3d图

解决方案

由于mesh3d类型本身不支持contours参数,可通过叠加两个mesh3d轨迹实现需求:一个轨迹显示彩色半透明曲面,另一个轨迹仅显示黑色线框(将面设为完全透明)。

实现代码:

library(plotly)
library(viridis)

# 定义数据
df1 <-data.frame(
  v1 = c(7000, 13000, 19000, 25000, 7000, 13000, 19000, 25000, 7000, 13000, 19000, 25000, 7000, 13000, 19000, 25000),
  v2 = c(10, 10, 10, 10, 66, 66, 66, 66, 178, 178, 178, 178, 312, 312, 312, 312),
  v3 = c(1200.123, 2500.567, 2400.789, 2300.456, 1650.789, 3700.123, 4200.345, 4300.567, 3300.456, 4000.789, 6800.123, 7810.345, 2300.789, 4200.567, 4900.123, 5200.567))

# 绘制带线框的mesh3d图
plot_ly() %>%
  # 彩色半透明曲面轨迹
  add_mesh3d(
    x = df1$v1, y = df1$v2, z = df1$v3,
    opacity = 0.45,
    colorscale = "Viridis", intensity = df1$v3,
    showlegend = FALSE
  ) %>%
  # 黑色线框轨迹(面完全透明)
  add_mesh3d(
    x = df1$v1, y = df1$v2, z = df1$v3,
    color = "black",
    line = list(width = 1),
    facecolor = "rgba(0,0,0,0)",
    opacity = 1,
    showlegend = FALSE
  ) %>%
  layout(scene = list(
    xaxis = list(title = "v1"),
    yaxis = list(title = "v2"),
    zaxis = list(title = "v3")
  ))

说明

  • 该方案既保留了mesh3d便于追踪x、y变量的优势,又实现了类似surface图的网格线效果。
  • 可通过调整line = list(width = ...)改变线框粗细,修改color参数更换线框颜色。

内容的提问来源于stack exchange,提问作者U. Mena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:05:54