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

如何在R的Plotly中为面赋值的3D三角曲面图添加颜色图例

解决Plotly 3D网格面着色的颜色图例问题

当使用mesh3d的facecolor参数为三角面直接分配颜色时,Plotly不会自动生成对应数值范围的颜色图例。我们可以通过添加一个隐藏的辅助scatter3d轨迹,关联自定义调色板与目标数值范围(0-7),从而显示需要的颜色图例。

以下是修改后的完整代码:

library(plotly)
library(colorspace)

# 定义自定义调色板
pal2 <- sequential_hcl(n = 99, h = c(320, 80), c = c(60, 65, 20), l = c(30, 95), 
                       power = c(0.7, 1.3))

# Landmark数据
lm <- matrix(c(0,1,0,0,0,0,1,0,0,0,0,1), ncol = 3)

# 三角面索引
it <- matrix(c(1,1,2,3,3,4), ncol = 3)

# 每个三角面对应的数值
f <- c(2,5)
# 根据数值匹配调色板颜色
col <- pal2[findInterval(f, seq(from = 0, to = 7, length.out = length(pal2)))]

# 将调色板转换为Plotly兼容的RGB格式
palRGB <- col2rgb(pal2)
colors <- sapply(1:99, function(i) {
  paste0("rgb(", palRGB[1,i], ", ", palRGB[2,i], ", ", palRGB[3,i], ")")
})
thresholds <- seq(0, 1, length.out = 99)
colorscale <- list(thresholds, colors)

# 创建3D网格图
fig <- plot_ly() %>%
  # 添加原有的mesh3d轨迹,为面着色
  add_trace(
    x = lm[,1], y = lm[,2], z = lm[,3],
    type = "mesh3d",
    i = it[,1]-1, j = it[,2]-1, k = it[,3]-1,
    facecolor = col
  ) %>%
  # 添加隐藏的scatter3d轨迹,用于生成颜色图例
  add_trace(
    x = lm[,1], y = lm[,2], z = lm[,3],
    type = "scatter3d",
    mode = "markers",
    opacity = 0,  # 隐藏点
    showlegend = FALSE,
    # 配置颜色映射参数
    intensity = seq(0,7,length.out = nrow(lm)),  # 覆盖目标数值范围
    colorscale = colorscale,
    cmin = 0,
    cmax = 7,
    showscale = TRUE  # 显示颜色图例
  )

# 显示图形
fig

关键说明:

  1. 保留原有的mesh3d轨迹逻辑,确保三角面的颜色正确分配。
  2. 新增的scatter3d轨迹使用透明点(opacity=0)隐藏显示,但通过intensity、colorscale、cmin、cmax参数关联我们的调色板和0-7的数值范围,从而触发颜色图例的生成。
  3. 调色板转换为RGB格式是为了符合Plotly的colorscale要求,确保颜色映射的一致性。

内容的提问来源于stack exchange,提问作者Patrick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:25:00