Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to animate a line chart in a streamlit page

I am working with a ML project and I want to display in (relative) real time a chart with a fitness function.

I am using code from this SO answer and it works fine as long as the chart is displayed in the matplotlib window. As soon as I add it to the page, it becomes a static image.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

max_x = 5
max_rand = 10

x = np.arange(0, max_x)
ax.set_ylim(0, max_rand)
line, = ax.plot(x, np.random.randint(0, max_rand, max_x))


def init():  # give a clean slate to start
    line.set_ydata([np.nan] * len(x))
    return line,


def animate(i):  # update the y values (every 1000ms)
    line.set_ydata(np.random.randint(0, max_rand, max_x))
    return line,

ani = animation.FuncAnimation(
    fig, animate, init_func=init, interval=1000, blit=True, save_count=10)

st.pyplot(plt)

Any idea how to animate a chart? It doesn't have to be matplotlib.

like image 752
Cristian Cotoi Avatar asked Oct 04 '19 13:10

Cristian Cotoi


1 Answers

I received my answer on the streamlit forum so I'm just copying the updated code here

import matplotlib.pyplot as plt
import numpy as np
import streamlit as st
import time

fig, ax = plt.subplots()

max_x = 5
max_rand = 10

x = np.arange(0, max_x)
ax.set_ylim(0, max_rand)
line, = ax.plot(x, np.random.randint(0, max_rand, max_x))
the_plot = st.pyplot(plt)

def init():  # give a clean slate to start
    line.set_ydata([np.nan] * len(x))

def animate(i):  # update the y values (every 1000ms)
    line.set_ydata(np.random.randint(0, max_rand, max_x))
    the_plot.pyplot(plt)

init()
for i in range(100):
    animate(i)
    time.sleep(0.1)
like image 64
Cristian Cotoi Avatar answered Nov 18 '22 12:11

Cristian Cotoi