кадры перекрываются в python3 анимации matplotlib - PullRequest
1 голос
/ 03 мая 2020

Я путаюсь с методом FuncAnimation. Я пытался показать данные датчика в реальном времени на моем Raspberry Pi, используя GP IOs. Я установил диапазон х на 100. Когда мои фреймы данных превышают 100, я выберу только последние 100 фреймов для отображения. В начале, когда количество кадров меньше 100, пи c показывает правильно. Проблема состоит в том, что, когда количество кадров превышает 100, более поздние числа пи c будут перекрываться с прежними числами пи c, и график просто будет испорчен. Вот начальный график и график перекрытия.

введите описание изображения здесь введите описание изображения здесь

Я проверил API Matplotlib и изменил параметр "blit" от True до False. Перекрытие исчезает, но частота кадров становится слишком низкой. Так как я также использовал FuncAnimation с blit, установленным True в другом коде, и перекрытие не появилось, я думаю, что-то еще не так.

Код перекрытия ниже:

max_limit = 20
fig, ax = plt.subplots(light_num, 1)
data = []
lines = []
for i in range(light_num):
    data.append([])
    ln_one_light, = ax[i].plot([], [], 'r-')
    lines.append(ln_one_light)

def init():
    for i in range(light_num):
        ax[i].set_xlim(0, max_limit)
        ax[i].set_ylim(lower_bound, upper_bound)
    return lines

def update(frame):
    # print(frame)
    global data
    for i in range(light_num):
        data[i].append(frame[i])
        if len(data[i]) > max_limit:
            data[i] = data[i][1:]
    time_axis = np.arange(len(data[i]))
    for i in range(light_num):
        # print(time_axis, data[i])
        lines[i].set_data(time_axis, data[i])
    return lines

def gen_function():
    res_array = []
    output_string = ''
    for i in range(light_num):
        val = GPIO.input(light_io_array[i])
        res_array.append(val)
        output_string = output_string + str(val) + ' '
    # print(res_array)
    lights_data_writer.update_data(output_string)
    yield res_array

ani = FuncAnimation(fig, update, frames=gen_function, interval = 500, repeat = True,
                    init_func=init, blit=True)
plt.show()

Код что я использовал с blit, установленным как True, но перекрытия не происходит:

fig, ax = plt.subplots(3, 1)
data_x, data_y, data_z = [], [], []
ln_x, = ax[0].plot([], [], 'r-')
ln_y, = ax[1].plot([], [], 'r-')
ln_z, = ax[2].plot([], [], 'r-')

def init():
    for i in range(3):
        ax[i].set_xlim(0, 100)
        ax[i].set_ylim(-5, 5)
    return (ln_x, ln_y, ln_z)

def update(frame):
    (x, y, z) = frame
    global data_x, data_y, data_z
    data_x.append(x)
    data_y.append(y)
    data_z.append(z)
    if len(data_x) > 100:
        data_x = data_x[1:]
        data_y = data_y[1:]
        data_z = data_z[1:]
    time_xyz = np.arange(len(data_x))
    # print(time_xyz, data_x)
    ln_x.set_data(time_xyz, data_x)
    ln_y.set_data(time_xyz, data_y)
    ln_z.set_data(time_xyz, data_z)
    return (ln_x, ln_y, ln_z)

def gen_function():
    while True:
        (x, y, z) = adxl345.getAxes()
        output_string = 'acc '+str(x)+' '+str(y)+' '+str(z)
        imu_data_writer.update_data(output_string)
        yield (x, y, z)

ani = FuncAnimation(fig, update, frames=gen_function, interval = 100,
                    init_func=init, blit=True)
plt.show()

Спасибо за всех, кто может взглянуть и проверить, что я сделал неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...