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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:21:40