如何在三维散点图中添加平面

问题描述

使用Blender创建此模型

可以在this link

的A框中看到

这个模型非常棒,它概述了我在这里试图实现的目标。基本上,我没有名称,而是用圆点来象征一个特定的平台。

在我看来,以目前的技术水平实现它的最佳方式是通过Plotly 3D Scatter Plots。我有以下散点图

import plotly.express as px
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/tiago-peres/immersion/master/Platforms_dataset.csv')
fig = px.scatter_3d(df, x='Functionality ', y='Accessibility', z='Immersion', color='Platforms')
fig.show()

通过转到this link,您可以单击按钮并在Colab中将其打开

这看起来几乎和模型很像。然而,仍然需要在特定的位置增加三个平面到情节中。更准确地说,在x=?,y=?z=?(我使用问号,因为该值可以是任何已设置的值)。

换句话说,要向散点图添加三个平面

  • x=10
  • y=30
  • z=40

在文档中,与我需要的内容非常相似的是3D Surface Plots。

我做了调查,发现R有两个类似的问题

  • Insert 2D plane into a 3D Plotly scatter plot in R

  • Add Regression Plane to 3d Scatter Plot in Plotly


解决方案

我认为您可能在plotly中查找add_trace函数,这样您就可以只创建曲面,然后将它们添加到图中:

另外,请注意,当然有一些方法可以简化此代码,但这只是一个概括性的想法:

import plotly.express as px
import pandas as pd
import plotly.graph_objects as go
import numpy as np


fig = px.scatter_3d(df, x='Functionality ', y='Accessibility', z='Immersion', color='Platforms')

bright_blue = [[0, '#7DF9FF'], [1, '#7DF9FF']]
bright_pink = [[0, '#FF007F'], [1, '#FF007F']]
light_yellow = [[0, '#FFDB58'], [1, '#FFDB58']]

# need to add starting point of 0 to each dimension so the plane extends all the way out
zero_pt = pd.Series([0])
z = zero_pt.append(df['Immersion'], ignore_index = True).reset_index(drop = True)
y = zero_pt.append(df['Accessibility'], ignore_index = True).reset_index(drop = True)
x = zero_pt.append(df['Functionality '], ignore_index = True).reset_index(drop = True)

length_data = len(z)
z_plane_pos = 40*np.ones((length_data,length_data))

fig.add_trace(go.Surface(x=x, y=y, z=z_plane_pos, colorscale=light_yellow,  showscale=False))
fig.add_trace(go.Surface(x=x.apply(lambda x: 10), y=y, z = np.array([z]*length_data), colorscale= bright_blue, showscale=False))
fig.add_trace(go.Surface(x=x, y= y.apply(lambda x: 30), z =  np.array([z]*length_data).transpose(), colorscale=bright_pink, showscale=False))

相关文章