使用Plotly将表格数据绘制为半径匹配数值的3D球体
Plotly 批量绘制对应数据值的3D球体实现方案
核心逻辑:Plotly 没有提供直接生成批量独立球体的标记类型,我们可以通过球坐标参数方程为每个数据点生成独立的球面网格,再用Mesh3D轨迹渲染每个球体,完全匹配坐标、半径的对应规则。
实现步骤
- 首先将两个表格的数值整理为二维数组,约定列索引对应X轴坐标、行索引对应Y轴坐标,表1所有球心Z坐标固定为1,表2所有球心Z坐标固定为2
- 编写通用球面生成函数:基于球坐标转直角坐标的公式,输入球心三维坐标、半径,返回构成球面的所有网格点坐标
- 遍历两个表格的所有单元格,为每个数值生成对应半径的球体轨迹,添加到3D画布中
- 调整坐标轴参数,避免球体被拉伸变形,设置半透明配色方便观察两层球体的位置关系
完整可运行代码
import numpy as np import plotly.graph_objects as go def create_sphere(x0: float, y0: float, z0: float, r: float, resolution: int = 25): """ 生成指定球心、半径的球面网格坐标 :param x0/y0/z0: 球心三维坐标 :param r: 球体半径 :param resolution: 球面精细度,数值越大球面越光滑,渲染负载越高 """ # 生成球面参数角度 u = np.linspace(0, 2 * np.pi, resolution) v = np.linspace(0, np.pi, resolution) # 球坐标转直角坐标 x = x0 + r * np.outer(np.cos(u), np.sin(v)) y = y0 + r * np.outer(np.sin(u), np.sin(v)) z = z0 + r * np.outer(np.ones_like(u), np.cos(v)) return x, y, z # 输入两个表格的数值 table1 = [ [4.5, 4.9, 4.9, 4.9, 4.7], [4.5, 4.8, 4.8, 4.8, 4.8], [4.3, 4.7, 4.7, 4.9, 4.9] ] table2 = [ [4.3, 4.7, 4.7, 4.9, 4.7], [4.4, 4.8, 4.8, 4.8, 4.7], [4.5, 4.9, 4.9, 4.9, 4.8] ] # 初始化3D画布 fig = go.Figure() # 生成表1对应的球体,固定z=1 for y_pos, row in enumerate(table1, start=1): for x_pos, radius in enumerate(row, start=1): sphere_x, sphere_y, sphere_z = create_sphere(x_pos, y_pos, 1, radius) fig.add_trace(go.Mesh3d( x=sphere_x.flatten(), y=sphere_y.flatten(), z=sphere_z.flatten(), color='#2563eb', opacity=0.7, showscale=False )) # 生成表2对应的球体,固定z=2 for y_pos, row in enumerate(table2, start=1): for x_pos, radius in enumerate(row, start=1): sphere_x, sphere_y, sphere_z = create_sphere(x_pos, y_pos, 2, radius) fig.add_trace(go.Mesh3d( x=sphere_x.flatten(), y=sphere_y.flatten(), z=sphere_z.flatten(), color='#ea580c', opacity=0.7, showscale=False )) # 调整画布布局,避免球体变形 fig.update_layout( scene=dict( xaxis_title='X轴(表格列位置)', yaxis_title='Y轴(表格行位置)', zaxis_title='Z轴(表格层级)', aspectmode='data' # 强制按真实坐标比例渲染,保证球体不变形 ), margin=dict(l=0, r=0, t=0, b=0) ) # 渲染展示 fig.show()
自定义调整说明
- 球面光滑度:修改
create_sphere函数的resolution参数即可,推荐设置在20-40之间,数值过低球面会有明显棱角,过高会拖慢渲染速度 - 配色与透明度:修改每个
Mesh3d的color参数调整球体颜色,修改opacity参数(取值0-1)调整透明度,数值越小越透明 - 数值标注:如果需要在每个球体上显示对应的半径数值,可以额外添加
go.Scatter3d轨迹,在每个球心坐标位置添加文本标记 - 坐标轴范围:如果需要固定坐标轴显示范围,可以在
scene配置里添加xaxis_range、yaxis_range、zaxis_range参数手动设置
内容的提问来源于stack exchange,提问作者Kunal
相关产品推荐
相关产品推荐

