了解 Plotly 中的 3D 轨迹

Posted

技术标签:

【中文标题】了解 Plotly 中的 3D 轨迹【英文标题】:Understanding 3D traces in Plotly 【发布时间】:2021-10-01 19:54:05 【问题描述】:

我正在使用 R 编程语言。我在 R 中制作了以下 3D 图:

# set seed for reproducibility 
#load libraries
    set.seed(123)
    library(dplyr)
    library(plotly)
    
#create data
    n <- 3
    my_grid <- expand.grid(i1 = 1:n, i2 = 1:n)
    my_grid$final_value = with(my_grid, sin(i1) + cos(i2) )
    
 
#make plot
       plot_ly() %>% 
        add_trace(data = my_grid,  x=my_grid$i1, y=my_grid$i2, z=my_grid$final_value, type='mesh3d') %>%
        add_surface(
            z = my_grid %>% as.matrix(),
            surfacecolor = my_grid,
            cauto=F,
            cmax=max(my_grid$final_value),
            cmin=min(my_grid$final_value)
        )

这会产生以下情节:

正如预期的那样,这个图看起来非常合乎逻辑:它显示了一个 3D 表面,其中 x = i1,y = i2,z = final_value,并且图的颜色根据“final_value”。

问题:如果我尝试向网格中添加更多数据,然后创建绘图:

#create more data
n <- 50
my_grid <- expand.grid(i1 = 1:n, i2 = 1:n)
my_grid$final_value = with(my_grid, sin(i1) + cos(i2) )


#make plot
plot_ly() %>% 
    add_trace(data = my_grid,  x=my_grid$i1, y=my_grid$i2, z=my_grid$final_value, type='mesh3d') %>%
    add_surface(
        z = my_grid %>% as.matrix(),
        surfacecolor = my_grid,
        cauto=F,
        cmax=max(my_grid$final_value),
        cmin=min(my_grid$final_value)
    )

这个图表不仅看起来“奇怪”,而且悬停文本中的“y 坐标”(1697)正在显示原始数据中不存在的值:

#display histogram of values

par(mfrow=c(1,3))

 hist(my_grid$i1)
 hist(my_grid$i2)
 hist(my_grid$final_value)

问题:在上面的直方图中,“1697”的值没有出现在任何变量中。那么,这么大的值怎么可能显示在 plotly 图中呢?

谢谢

【问题讨论】:

【参考方案1】:

首先,您混淆了两种不同的跟踪类型:

一方面是mesh3d,另一方面是surface 跟踪。两者都可以处理 x、y、z 坐标。

但是,您将矩阵作为表面轨迹的 z 参数传递(并且没有 x 和 y 值)。因此,plotly 将矩阵的值考虑到 z 轴和矩阵的维度 (2500 x 3) 的 y 和 x。

请同时运行schema() 并导航到:

物体 ► 痕迹 ► 表面 ► 属性

对象 ► 轨迹 ► mesh3d ► 属性

查看差异。

关于你的数据集,我猜你想要这样的东西:

# set seed for reproducibility 
#load libraries
set.seed(123)
library(dplyr)
library(plotly)

#create more data
n <- 50
my_grid <- expand.grid(i1 = 1:n, i2 = 1:n)
my_grid$final_value = with(my_grid, sin(i1) + cos(i2) )

#make plot
plot_ly(data = my_grid,  x=~i1, y=~i2, z=~final_value, type='mesh3d', intensity = ~final_value, colors = colorRamp(c("blue", "grey", "red")))

【讨论】:

以上是关于了解 Plotly 中的 3D 轨迹的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny 为 Plotly 折线图选择轨迹?

如何将 R Plotly 中的子图之间的轨迹与共享的 Y 轴链接起来,以便 hoverinfo 出现在两者上?

如何在 Plotly 中使用高亮功能在 y1 和 y2 轴上有 2 条轨迹

使用 Plotly.update() 更新轨迹的“x”和“y”值

使用 plotly javascript 库控制不同轨迹的特定 x 轴范围的图例

Plotly:如何使用类似于在图例中单击它们的按钮来切换轨迹?