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

如何用Python Plotly移除3D图网格并设置球心箭头坐标轴?

Plotly实现方案

我来帮你搞定这个需求!首先咱们先在Plotly里实现你要的效果,之后再给你推荐替代方案。

我们需要完成两件核心事:隐藏默认的网格和坐标轴,然后添加从球心出发的自定义箭头坐标轴。Plotly默认的3D坐标轴没法直接改成箭头样式,但我们可以用annotations来模拟箭头,同时把默认坐标轴完全隐藏。

下面是修改后的完整代码:

import plotly.graph_objects as go

# 你的x, y, z, c_norm, z1_sources_coord, z2_sources_coord定义保留原有逻辑即可
trace = [
        go.Surface(
            name='Map',
            x=tuple(x),
            y=tuple(y),
            z=tuple(z),
            colorscale='Viridis',
            surfacecolor=c_norm,
            hoverinfo='text',
            opacity=1
            ),
        go.Scatter3d(
                name='Z1 source',
                x=[z1_sources_coord[0,0]], 
                y=[z1_sources_coord[0,1]], 
                z=[z1_sources_coord[0,2]], 
                mode='markers', 
                marker=dict(size=3, color='red'),
                opacity=1
            ),
        go.Scatter3d(
                name='Z2 source',
                x=z2_sources_coord[:,0], 
                y=z2_sources_coord[:,1], 
                z=z2_sources_coord[:,2], 
                mode='markers', 
                marker=dict(size=6, color='blue'),
                opacity=1
            )
]

fig=go.Figure(data=trace)

# 隐藏默认的网格、刻度和坐标轴
fig.update_layout(
    scene=dict(
        xaxis=dict(showgrid=False, showticklabels=False, visible=False),
        yaxis=dict(showgrid=False, showticklabels=False, visible=False),
        zaxis=dict(showgrid=False, showticklabels=False, visible=False),
        bgcolor='white'  # 可选,让背景更干净清爽
    )
)

# 添加自定义箭头坐标轴(假设球心是(0,0,0),如果你的球心不是这个,修改ax/ay/az和终点坐标)
# X轴箭头
fig.add_annotation(
    x=1.2, y=0, z=0,  # 箭头终点,根据球体大小调整长度
    xref='x', yref='y', zref='z',
    text='X',
    showarrow=True,
    arrowhead=2,
    arrowsize=1.5,
    arrowwidth=2,
    ax=0, ay=0, az=0,  # 箭头起点(球心)
    font=dict(size=12)
)

# Y轴箭头
fig.add_annotation(
    x=0, y=1.2, z=0,
    xref='x', yref='y', zref='z',
    text='Y',
    showarrow=True,
    arrowhead=2,
    arrowsize=1.5,
    arrowwidth=2,
    ax=0, ay=0, az=0,
    font=dict(size=12)
)

# Z轴箭头
fig.add_annotation(
    x=0, y=0, z=1.2,
    xref='x', yref='y', zref='z',
    text='Z',
    showarrow=True,
    arrowhead=2,
    arrowsize=1.5,
    arrowwidth=2,
    ax=0, ay=0, az=0,
    font=dict(size=12)
)

fig.show()

注意:如果你的球体球心不是(0,0,0),需要把ax/ay/az改成球心坐标,箭头终点坐标改成球心坐标 + (轴方向长度, 0, 0)这类形式,保证箭头从球心出发。


替代方案(如果Plotly的效果达不到预期)

如果觉得Plotly的箭头不够灵活,或者需要更专业的3D渲染效果,可以试试下面这些Python库:

1. Matplotlib (mplot3d)

Matplotlib的3D模块虽然交互性不如Plotly,但自定义性很强,用quiver3d可以轻松画出坐标轴箭头:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

# 替换成你自己的球体数据
u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j]
x = np.cos(u)*np.sin(v)
y = np.sin(u)*np.sin(v)
z = np.cos(v)

fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111, projection='3d')

# 隐藏默认网格和坐标轴
ax.grid(False)
ax.set_axis_off()

# 绘制球体
ax.plot_surface(x, y, z, cmap='viridis')

# 绘制标记点
ax.scatter(z1_sources_coord[0,0], z1_sources_coord[0,1], z1_sources_coord[0,2], color='red', s=30)
ax.scatter(z2_sources_coord[:,0], z2_sources_coord[:,1], z2_sources_coord[:,2], color='blue', s=60)

# 添加坐标轴箭头
ax.quiver(0,0,0, 1.2,0,0, color='black', arrow_length_ratio=0.1)
ax.quiver(0,0,0, 0,1.2,0, color='black', arrow_length_ratio=0.1)
ax.quiver(0,0,0, 0,0,1.2, color='black', arrow_length_ratio=0.1)

# 添加轴标签
ax.text(1.3, 0, 0, 'X', fontsize=12)
ax.text(0, 1.3, 0, 'Y', fontsize=12)
ax.text(0, 0, 1.3, 'Z', fontsize=12)

plt.tight_layout()
plt.show()

2. Mayavi

Mayavi是专门针对科学3D可视化的库,渲染效果和交互性都非常出色,适合复杂的3D场景。它可以轻松实现自定义坐标轴箭头和隐藏网格,不过学习成本比Matplotlib略高。

示例代码片段(核心部分):

from mayavi import mlab
import numpy as np

# 绘制球体
u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j]
x = np.cos(u)*np.sin(v)
y = np.sin(u)*np.sin(v)
z = np.cos(v)
mlab.mesh(x, y, z, colormap='viridis')

# 绘制标记点
mlab.points3d(z1_sources_coord[0,0], z1_sources_coord[0,1], z1_sources_coord[0,2], color=(1,0,0), scale_factor=0.1)
mlab.points3d(z2_sources_coord[:,0], z2_sources_coord[:,1], z2_sources_coord[:,2], color=(0,0,1), scale_factor=0.2)

# 隐藏默认坐标轴和网格
mlab.axes(visible=False)
mlab.outline(visible=False)

# 添加自定义坐标轴箭头
mlab.quiver3d(0,0,0, 1.2,0,0, color=(0,0,0), scale_factor=1, line_width=2)
mlab.quiver3d(0,0,0, 0,1.2,0, color=(0,0,0), scale_factor=1, line_width=2)
mlab.quiver3d(0,0,0, 0,0,1.2, color=(0,0,0), scale_factor=1, line_width=2)

# 添加轴标签
mlab.text3d(1.3, 0, 0, 'X', scale=0.1, color=(0,0,0))
mlab.text3d(0, 1.3, 0, 'Y', scale=0.1, color=(0,0,0))
mlab.text3d(0, 0, 1.3, 'Z', scale=0.1, color=(0,0,0))

mlab.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:02:26