如何用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
相关产品推荐
相关产品推荐

