Python 是否有更好的方法使用Matplotlib绘制正交轴?

Python 是否有更好的方法使用Matplotlib绘制正交轴?,python,python-2.7,matplotlib,Python,Python 2.7,Matplotlib,啊 我正在尝试使用matplotlibquiver函数在3D中绘制向量。为了帮助可视化它们,我还想绘制以原点为中心的正交轴 理想情况下,我想移动所谓的脊椎,但据我所知,没有简单的修复方法 我最终将轴绘制为沿x、y和z的三个向量(见下面的代码),但我忍不住认为这是一个糟糕的解决方案。。。任何意见都将不胜感激 代码如下: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D

我正在尝试使用matplotlib
quiver
函数在3D中绘制向量。为了帮助可视化它们,我还想绘制以原点为中心的正交轴

理想情况下,我想移动所谓的脊椎,但据我所知,没有简单的修复方法

我最终将轴绘制为沿x、y和z的三个向量(见下面的代码),但我忍不住认为这是一个糟糕的解决方案。。。任何意见都将不胜感激

代码如下:

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

f = plt.figure(1)
ax=plt.gca()
soa = np.array([[0, 0, 0, 1, 0, 0],[0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 0, 1]])
X, Y, Z, U, V, W = zip(*soa)
soa2 = np.array([[0,0,0,np.sqrt(2)/2,np.sqrt(2)/2,np.sqrt(2)/2]])
I, J, K, F, G, H = zip(*soa2)

fig = plt.figure()
ax=Axes3D(fig)
ax.quiver(X, Y, Z, U, V, W, color='black')
ax.quiver(I, J, K, F, G, H)
ax.set_xlim([-1, 1])
ax.set_ylim([-1, 1])
ax.set_zlim([-1, 1])
f.show()
下面是这个脚本返回的图像:


我不想使用
quiver
,因为它不能为其输入参数
X
Y
Z
U
V
W
正确处理128个数据类型。事实上,它默默地将这些输入转换为float,这在我们的系统中通常是float64。结果,float128输入导致溢出

相反,我想在中使用的简短类
Arrow3D
。它可以完美地使用128坐标,并提供各种箭头样式

有了这些帮助,我开发了这个函数,可以在图形中心绘制X、Y和Z轴:

将numpy导入为np
将matplotlib.pyplot作为plt导入
从Arrow3D导入Arrow3D
def在中心(mpl)绘制X轴:
#根据绘制的数据计算max_lim
x_lim=abs(最大值(mpl_ax.get_xlim(),key=abs))
y_lim=abs(max(mpl_ax.get_ylim(),key=abs))
z_lim=abs(最大值(mpl_ax.get_zlim(),key=abs))
max_lim=max(x_lim,y_lim,z_lim)
#将xyz轴定位在中心
mpl\u ax.set\u xlim(-max\u lim,max\u lim)
mpl\u ax.set\u ylim(-max\u lim,max\u lim)
mpl\u ax.set\u zlim(-max\u lim,max\u lim)
#绘制xyz轴
轴=['x','y','z']
对于i,枚举中的轴(轴):
开始_结束_pts=np.零((3,2))
开始\u结束\u点[i]=[-max\u lim,max\u lim]
#画轴
xs、ys、zs=start_end_pts[0],start_end_pts[1],start_end_pts[2]
a=箭头3D(xs、ys、zs、,
突变(比例=20,箭头样式='-|>',颜色='黑色')
mpl\u ax.添加艺术家(a)
#添加标签
带填充的结束点=开始点结束点[:,1]*1.1
mpl_ax.text(*带填充的结尾部分),
轴
水平对齐='中心',
垂直对齐='中心',
颜色(黑色)
要绘制向量,请执行以下操作:

def draw_向量(mpl_ax,v):
xs=[0,v[0]]
ys=[0,v[1]]
zs=[0,v[2]]
a=箭头3D(xs、ys、zs、,
突变(比例=20,箭头样式='->',颜色='#1f77b4')
mpl\u ax.添加艺术家(a)
#轴限制自动包括所有打印数据的坐标
#但不是3D艺术家。这就是为什么要画这一点。
mpl_ax.plot(*v',,color='#1f77b4')
让我们使用它们:

ax=plt.figsize=(7,7)).add_子图(projection='3d')
绘制向量(ax,np.数组([2,3,5]))
在轴中心(ax)绘制轴
ax.set_xlabel('x轴')
ax.set_ylabel('y轴')
ax.set_zlabel('z轴')
plt.show()
输出:


顺便说一句,我使用了Python 3,没有在Python 2上测试它。

谢谢你的详细回答,Shahrokh-Bah!这正是我要找的!