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

如何让Plotly 3D散点图相机位于穿过原点的深度射线?

问题解决:调整Plotly 3D相机视角使视线沿(0,0,1)正对原点

问题原因分析

  1. 相机up方向设置错误:你设置up=dict(x=0, y=0, z=1),这会把视图的"向上方向"指定为z轴,导致整个坐标系旋转,出现倾斜。当相机位于z轴正方向看向原点时,正确的视图向上方向应为y轴((0,1,0))。
  2. 坐标轴缩放不一致:默认aspectmode会根据数据范围自动缩放坐标轴,导致视觉上的倾斜感,需要强制等比例显示。
  3. 红色向量显示为线:受up方向和缩放影响,视线未完全与红色向量重合,因此向量在屏幕上呈现为线而非点。

修正后的代码

from numpy import array
import plotly.graph_objects as go

vec1 = array([-0.20306842,  0.90820287,  0.36596552])
vec2 = array([-0.91857355,  0.15817927, -0.36221809])
vec3 = array([ 0.38370564,  0.13700477, -0.91323583])

fig = go.Figure(data=[
    go.Scatter3d(
        x=[0, vec1[0]], y=[0, vec1[1]], z=[0, vec1[2]],
        mode='lines', line=dict(width=10, color='blue'),
    ),
    go.Scatter3d(
        x=[0, vec2[0]], y=[0, vec2[1]], z=[0, vec2[2]],
        mode='lines', line=dict(width=10, color='green'),
    ),
    go.Scatter3d(
        x=[0, vec3[0]], y=[0, vec3[1]], z=[0, vec3[2]],
        mode='lines', line=dict(width=10, color='black'),
    ),
    go.Scatter3d(
        x=[0, 0], y=[0, 0], z=[0, 1],
        mode='lines', line=dict(width=10, color='red'),
        name='viewport depth direction'
    )])

fig.update_scenes(
    camera=dict(
        # 修正视图向上方向为y轴,符合常规3D坐标系朝向
        up=dict(x=0, y=1, z=0),
        # 相机看向原点
        center=dict(x=0, y=0, z=0),
        # 相机位于z轴正方向,沿(0,0,1)射线指向原点
        eye=dict(x=0, y=0, z=3),
        # 可选:使用正交投影,避免透视变形,让向量重合效果更直观
        projection=dict(type='orthographic')
    ),
    # 强制三个坐标轴等比例显示,消除视觉倾斜
    aspectmode="cube"
)

fig.show()

关键调整说明

  • up=dict(x=0, y=1, z=0):将视图的向上方向设为y轴,确保坐标系正确朝向,解决倾斜问题。
  • aspectmode="cube":让x、y、z轴的单位长度在屏幕上显示一致,避免自动缩放导致的视觉扭曲。
  • projection=dict(type='orthographic'):可选设置,使用正交投影代替默认透视投影,此时红色向量会完全呈现为一个点(视线与向量完全重合),透视投影下可能因近大远小效果仍有细微线条,但不影响核心需求。

内容的提问来源于stack exchange,提问作者matanox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:41:17