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()
Другие вопросы по тегам