Matplotlib добавить к оси Z
Я хочу построить 3D-график, используя matplotlib (python), данные которого добавляются в реальном времени (x,y,z).
В приведенном ниже коде данные успешно добавляются по осям X и Y, но по оси Z я столкнулся с проблемами. Хотя я искал в документах matplotlib, я не мог найти никаких решений.
что нужно добавить / изменить к этому коду, чтобы он добавлял данные по оси z?
что работает правильно:
return plt.plot(x, y, color='g')
проблема:
return plt.plot(x, y, z, color='g')
Код:
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
import random
np.set_printoptions(threshold=np.inf)
fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')
x = []
y = []
z = []
def animate(i):
x.append(random.randint(0,5))
y.append(random.randint(0,5))
z.append(random.randint(0,5))
return plt.plot(x, y, color='g')
#return plt.plot(x, y, z, color='g') => error
ani = animation.FuncAnimation(fig, animate, interval=1000)
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_zlabel('z')
plt.show()
Как сделать это правильно?
1 ответ
Метод построения, который вы хотите использовать для 3D-графиков, Axes3D
, Следовательно, вам нужно построить
ax1.plot(x, y, z)
Однако кажется, что вы хотите обновить данные вместо того, чтобы строить их заново (чтобы линия выглядела как-то растеризованной, так как она будет состоять из всех графиков).
Так что вы можете использовать set_data
и для третьего измерения set_3d_properties
, Обновление сюжета будет выглядеть так:
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')
x = []
y = []
z = []
line, = ax1.plot(x,y,z)
def animate(i):
x.append(np.random.randint(0,5))
y.append(np.random.randint(0,5))
z.append(np.random.randint(0,5))
line.set_data(x, y)
line.set_3d_properties(z)
ani = animation.FuncAnimation(fig, animate, interval=1000)
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_zlabel('z')
ax1.set_xlim(0,5)
ax1.set_ylim(0,5)
ax1.set_zlim(0,5)
plt.show()