You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Plotly中简便旋转通过plotly.graph_objects.Mesh3d创建的3D网格90度?

嘿,很高兴帮你搞定Plotly里3D网格旋转的问题!针对你提到的需求,我分两种情况给你说最简便的实现方式:

一、针对你附图所示的特定90度旋转

如果是要直接修改3D网格本身的坐标(不是只调整视角),最直接的方法就是对x/y/z坐标做轴映射+符号调整——毕竟90度旋转本质就是坐标轴的互换或方向反转。举个例子,假设你要绕x轴顺时针转90度,只需要把原网格的yz坐标做如下替换:

# 假设原网格的x、y、z是列表或numpy数组
rotated_x = x
rotated_y = z  # 用原z值替换y
rotated_z = -y # 用原y的负值替换z,保证旋转方向符合你附图的预期

# 更新你的Mesh3d对象
fig.data[0].x = rotated_x
fig.data[0].y = rotated_y
fig.data[0].z = rotated_z

你可以根据附图的旋转方向,调整轴的映射关系(比如绕y轴转的话,就互换x和z并调整符号),试一次就能匹配上效果。

二、Plotly中通用的3D网格90度旋转方法

如果需要更通用的旋转方案(比如适配任意轴的90度旋转),可以用旋转矩阵来实现,这也是Plotly里处理3D网格旋转的标准简便方式:

import numpy as np

# 先定义你需要的旋转矩阵,比如绕z轴转90度(π/2弧度)
rotation_matrix = np.array([
    [np.cos(np.pi/2), -np.sin(np.pi/2), 0],
    [np.sin(np.pi/2), np.cos(np.pi/2), 0],
    [0, 0, 1]
])

# 把原坐标合并成(n, 3)的矩阵
original_coords = np.vstack([x, y, z]).T
# 应用旋转矩阵(注意矩阵乘法的顺序)
rotated_coords = original_coords @ rotation_matrix.T
# 拆分回x、y、z分量
rotated_x, rotated_y, rotated_z = rotated_coords.T

# 更新网格数据
fig.data[0].x = rotated_x
fig.data[0].y = rotated_y
fig.data[0].z = rotated_z

另外,如果你只是想临时调整可视化视角(不需要修改网格本身的数据),直接修改Plotly的相机参数就行,代码更简单:

fig.update_layout(scene_camera=dict(
    eye=dict(x=0, y=1.5, z=1.5), # 通过相机位置实现视角旋转
    up=dict(x=0, y=0, z=1) # 定义"向上"的轴,辅助调整旋转后的视觉效果
))

总结一下:要是需要永久改变网格的形状,用坐标映射或旋转矩阵最靠谱;要是只是看的时候转个角度,调相机参数就够了。

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

火山引擎 最新活动