matplotlib散点图,其中xyz轴线通过原点(0,0,0),并且轴投影线到达每个点

时间:2019-03-03 15:27:23

标签: python matplotlib

使用matplotlib进行绘图时,我总是会遇到此问题...他们没有在绘图上绘制轴线的概念,在这种情况下,我特别希望在散点图上绘制xyz轴线,以使其看起来像附件照片,包括从点到轴的投影线。

ploting a point with explicit axis lines through origin

相反,这就是我得到的:

# from jupyter notebook
%matplotlib
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()

ax = fig.add_subplot(111, projection='3d')

ax.scatter( 1,  1,  1, c='r', marker='o')
ax.scatter( 1, -1,  1, c='b', marker='o')
ax.scatter(-1,  1, -1, c='g', marker='o')

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
ax.set_zlim(-2,2)

#ax.set_xticks(np.arange(-2, 2, 1))
#ax.set_yticks(np.arange(-2, 2, 1))
#ax.set_zticks(np.arange(-2, 2, 1))

plt.show()

1 个答案:

答案 0 :(得分:0)

好的,所以也许有直接的方法可以做到这一点。如果没有,那么此代码将解决您的大部分问题。我创建了一个函数,可以根据需要生成虚线。 使用ax.quiver()生成坐标系。

编辑: 您可以使用ax.set_axis_off()之类的命令来生成发布的图像。

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

def make_dashedLines(x,y,z,ax):
    for i in range(0, len(x)):
        x_val, y_val, z_val = x[i],y[i],z[i]
        ax.plot([0,x_val],[y_val,y_val],zs=[0,0], linestyle="dashed",color="black")
        ax.plot([x_val,x_val],[0,y_val],zs=[0,0], linestyle="dashed",color="black")
        ax.plot([x_val,x_val],[y_val,y_val],zs=[0,z_val], linestyle="dashed",color="black")

fig = plt.figure()

ax = fig.add_subplot(111, projection='3d')
x = [1,1,-1]
y = [1,-1,1]
z = [1,1,-1]

ax.scatter( x,y,z, c='r', marker='o')
make_dashedLines(x,y,z,ax)

# Make a 3D quiver plot
x, y, z = np.array([[-2,0,0],[0,-2,0],[0,0,-2]])
u, v, w = np.array([[4,0,0],[0,4,0],[0,0,4]])
ax.quiver(x,y,z,u,v,w,arrow_length_ratio=0.1, color="black")
ax.grid(False)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
ax.set_zlim(-2,2)

plt.show()

输出:

enter image description here