如何在三维散点图中添加平面
问题描述
使用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))
相关文章