如何在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图效果:
# 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类型本身不支持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
相关产品推荐
相关产品推荐

