如何将Matplotlib 3D图像的坐标轴修改为带箭头的x/y/z轴样式
实现方案
两种实现思路均可行:既可以通过在坐标轴末端叠加箭头营造对应视觉效果,也可以修改3D绘图边框参数实现,其中叠加箭头的方案实现更简单,兼容性更强,不需要调整matplotlib底层参数。
完整可运行代码
import numpy as np import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # generate sample points and straight line z = np.repeat(0, 100) x = np.repeat(1.0, 100) y = np.linspace(start=3.0, stop=6.0, num=100) ax.plot(x, y, z, c='red') # draw straight line ax.view_init(45, -150) # angle to show # set axes limits and labels ax.set_xlabel(r"$x$"); ax.set_ylabel(r"$y$"); ax.set_zlabel(r"$z$") ax.set_xlim(0,1.1) ;ax.set_ylim(6,3) ;ax.set_zlim(0,1.75) # Remove tick marks ax.set_xticks([0,0.25,0.5,0.75,1]) ; ax.set_xticklabels(['0','1','2','4','T']) ax.set_yticks([6.0,5.5,5,4.5,4.0,3.5,3]) ; ax.set_yticklabels(["","","","","","",""]) ax.set_zticks([1.75,1.25,0.75,0.25]) ; ax.set_zticklabels(['','','','']) # 新增修改内容开始 # 隐藏原生坐标轴脊线,消除默认方框边框 ax.w_xaxis.line.set_color('none') ax.w_yaxis.line.set_color('none') ax.w_zaxis.line.set_color('none') # 关闭背景网格 ax.grid(False) # 把所有轴面板都设为白色 ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 1.0)) ax.w_yaxis.set_pane_color((1.0, 1.0, 1.0, 1.0)) ax.w_zaxis.set_pane_color((1.0, 1.0, 1.0, 1.0)) # 绘制三个带箭头的坐标轴 # x轴箭头:沿x轴正方向延伸到上限 ax.quiver(0, 3, 0, 1.1, 0, 0, color='black', arrow_length_ratio=0.05, linewidth=1.5) # y轴箭头:沿y轴正方向延伸到上限 ax.quiver(0, 3, 0, 0, 3, 0, color='black', arrow_length_ratio=0.05, linewidth=1.5) # z轴箭头:沿z轴正方向延伸到上限 ax.quiver(0, 3, 0, 0, 0, 1.75, color='black', arrow_length_ratio=0.05, linewidth=1.5) # 新增修改内容结束 #plt.savefig("sample.png", format="png",dpi=400) # save image plt.tight_layout() plt.show()
核心修改说明
- 修正了原代码中
ax.set_zticks行缺少分隔符的语法错误 - 隐藏了三个坐标轴的默认脊线,消除原生的方框式边框
- 补充y、z轴的面板背景设置为全白,和x轴保持一致
- 调用
ax.quiver()接口分别在x、y、z三个坐标轴的正方向末端绘制箭头,可通过arrow_length_ratio参数调整箭头大小,linewidth调整坐标轴粗细
内容的提问来源于stack exchange,提问作者user4933
相关产品推荐
相关产品推荐

