在尝试操作matplotlib中的图形时,我遇到了一些有趣的东西。使用绘图函数时,可以通过锯齿修改x和y坐标,但z不能。这很容易解释吗? 我已经包含了一个小例子,请注意我试图让点沿着圆柱体以螺旋线移动。
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
radius = 8
# Cylinder
x = np.linspace(-radius, radius, 100)
z = np.linspace(0, 2, 100)
X, Z = np.meshgrid(x, z)
Y = np.sqrt(radius**2 - X**2)
ax.plot_surface(X, Y, Z, alpha=0.3, linewidth=0)
ax.plot_surface(X, (-Y), Z,alpha=0.3, linewidth=0)
X = np.array(np.zeros(1))
Y = np.array(np.zeros(1))
Z = np.array(np.zeros(1))
X[0]= radius*np.cos(np.deg2rad(0))
Y[0]= radius*np.sin(np.deg2rad(0))
Z[0]= 0.
ax.plot(X,Y,Z, 'or',markersize=3)
for i in range(0,360,5):
X[0]= radius*np.cos(np.deg2rad(i))
Y[0]= radius*np.sin(np.deg2rad(i))
Z[0]= i/140.
plt.draw()
plt.pause(0.01)
作为参考,本练习的最终目标是能够在三个维度上实时基于传感器输入定位点。
感谢所有了解为何发生这种情况的人以及可能的解决方案!
答案 0 :(得分:1)
这确实很有趣.. Line3D
源自Line2D
,因此get_xdata
或set_xdata
等功能在z
方向也无法使用。查看源代码(art3d.py
),似乎完全忽略了z
值:
def draw(self, renderer):
xs3d, ys3d, zs3d = self._verts3d
xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
self.set_data(xs, ys)
lines.Line2D.draw(self, renderer)
但也许我没有正确理解Line3D
的工作方式......
但是有一个函数可用于操作z
值(set_3d_properties
),但由于该函数本身调用get_xdata
和get_ydata
,这是我能得到的唯一方法这个工作是:
p = ax.plot(X,Y,Z, 'or', markersize=3)[0]
for i in range(0,360,5):
p.set_xdata(radius*np.cos(np.deg2rad(i)))
p.set_ydata(radius*np.sin(np.deg2rad(i)))
p.set_3d_properties(zs=i/140.)