Python - живое обновление графиков; с матплотлибом - PullRequest
0 голосов
/ 03 мая 2020

все. Я сталкиваюсь с проблемой сделать живую анимацию обновления. Здесь у меня есть age.csv файл , как показано ниже, который имеет три столбца. Последние два столбца (Age & Child) меняются вместе с первым столбцом (Year), поэтому я хочу сделать анимацию.

Year  Age  Child
2011  50     1
2012  60     2
2013  55     3
2014  35     6
2015  45     4
2016  75     7

Окончательный эффект должен выглядеть на веб-странице следующим образом:

(Вы можете прокрутить вниз, чтобы посмотреть «температура во времени» mov ie. Я не использовал их коды, поэтому их коды не имеют отношения к этому вопросу.)

https://learn.sparkfun.com/tutorials/graph-sensor-data-with-python-and-matplotlib/update-a-graph-in-real-time

Вот код, созданный мной

import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

list_year=[]
list_age=[]
list_child=[]

def animate(i):
    with open('age.csv','r') as f:
        next(f) # skip header

        for row in f:
            year,age,child = (s.strip() for s in row.split(','))
            list_year.append(year)
            list_age.append(int(age))
            list_child.append(int(child))

        ax.clear()
        ax.plot(list_year,list_age)
        ax.plot(list_year,list_child)

anim = animation.FuncAnimation(fig, animate,interval=1000) 
anim.save('livetime.gif', writer='imagemagick')

Однако, хотя я наконец получил следующий рисунок, чтобы показать изменения, это определенно не анимация gif, которую я ожидал.

цифра, которую я получил как сбой

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

1 Ответ

0 голосов
/ 03 мая 2020

Ваша проблема в том, что вы визуализируете все данные в каждом кадре анимации. Вам нужно обрабатывать одну строку входных данных каждый раз, когда вызывается функция animate. Самый простой способ сделать это, вероятно, создать список строк из входного файла и проиндексировать список, например:

import os
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

list_year=[]
list_age=[]
list_child=[]
lines = []

def animate(i):

    year,age,child = (s.strip() for s in lines[i].split(','))
    list_year.append(year)
    list_age.append(int(age))
    list_child.append(int(child))

    ax.clear()
    ax.plot(list_year,list_age)
    ax.plot(list_year,list_child)

with open(os.path.join(os.path.realpath('.'), 'src/test/age.csv'),'r') as f:
    next(f) # skip header
    lines = f.readlines()

anim = animation.FuncAnimation(fig, animate, interval=1000, frames=len(lines)) 

anim.save(os.path.join(os.path.realpath('.'), 'src/test/livetime.gif'), writer='imagemagick')

enter image description here

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