Как сделать анимацию для трех графиков сразу?

Есть часть программы, которая создаёт анимацию, по циклу кадров for i in range(m). Число кадров m=50, 30, 20 соответственно для x=0.5, 0.3, 0.2.

 for i in range(50):
            clear_output(wait = True)
            plt.plot(t, u[:, i], 'k-', lw = 2) # рисуем график 1
            fig = plt.figure(1, figsize = (7, 5)) # холст
            plt.xlim(0, 1) # границы осей, чтобы график не дёргался
            plt.ylim(0, np.max(u))
            plt.grid(ls = 'solid', lw = 0.5, color = 'g')
            plt.xlabel('t',fontsize = 14) # создаём надписи осей
            plt.ylabel('u(t, x)',fontsize = 14) 
            plt.title(f'Кадр:{i + 1}',fontsize = 14) #заголовок
            plt.show() #отображение графика
            sleep(0) # подождём интервал сек

Как мне сделать анимацию для 3 графиков, чтобы они выводились вместе, с styles[i], где styles = ('g-.', 'r--', 'b-'). Внизу программа, которая работает для x=0,5 при m=50.

Условие задачи.

  1. Разработали функцию для расчета распределения температуры в стрежне. Необходимо для всех параметров, передаваемых функции сконструировать пользовательский интерфейс, разместить виджеты в два столбца, запуск расчёта осуществлять нажатием кнопки с надписью Запустить.

  2. Анимировать отображение u(t) для x=0.2, 0.3. 0.5. Запускать/останавливать анимацию по нажатию кнопки (кнопок). Сделать так, чтобы приложение работало в Voila.

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
from ipywidgets import widgets as w 
from IPython.display import display, clear_output  
from time import sleep # sleep(n) stop проги, m/c 

def bar(b):
    
    u0 = w_u0.value
    dx = w_dx.value
    tmax = w_tmax.value
    dt = w_dt.value
    alpha = w_alpha.value
    C = w_C.value
    D = w_D.value
    p = w_p.value
    i = w_i.value
#     m = w_m.value
#     tstep = w_tstep.value
    styles = ('b-', 'r--', 'g-.')
    
    
    nx = 101
    nt = 100001
    x = np.linspace(0, 1, nx)
    t = np.linspace(0, 1, nt) 
    
    A = dt/C*D/dx**2  
    B = 2*A + alpha*dt/C - 1 
    P = np.ones((nt, nx))*(p + alpha*u0)*dt/C  
    u = np.zeros((nt, nx)) 

    for i in range(nt-1): 
         u[i+1, 1:-1] = A * u[i, 2:] - B * u[i, 1: -1] + A * u[i, 0: -2] + P[i, 1: -1] 

    xs = [0.5, 0.3, 0.2]
   
    
    with out2:
        for i in range(50):
            clear_output(wait = True)
            plt.plot(t, u[:, i], 'k-', lw = 2) # рисуем график 1
            fig = plt.figure(1, figsize = (7, 5)) # холст
            plt.xlim(0, 1) # границы осей, чтобы график не дёргался
            plt.ylim(0, np.max(u))
            plt.grid(ls = 'solid', lw = 0.5, color = 'g')
            plt.xlabel('t',fontsize = 14) # создаём надписи осей
            plt.ylabel('u(t, x)',fontsize = 14) 
            plt.title(f'Кадр:{i + 1}',fontsize = 14) #заголовок
            plt.show() #отображение графика
            sleep(0) # подождём интервал сек               
    return u, t, x



# Области вывода
out1 = w.Output(layout = {'widtg':'50%'}) # для виджетов
out2 = w.Output(layout = {'widtg':'50%'}) # для аним


# Виджеты параметров функции bar()
w_u0_L = w.Label('температура среды, U0:')   
w_u0 = w.IntSlider(value = 0, min = 0, max = 20, step = 1 )

w_dx_L = w.Label('шаг по пространственнной координате, dx:') 
w_dx = w.FloatText(value = 0.01) 

w_tmax_L = w.Label('время интегрирования уравнения, tmax:') 
w_tmax = w.FloatText(value = 0.1)

w_dt_L = w.Label('шаг по времени, dt:') 
w_dt = w.FloatText(value = 1e-6)

w_alpha_L = w.Label('теплоотдача, alpha:') 
w_alpha = w.IntText(value = 1) 

w_C_L = w.Label('теплоемкость, C:')  
w_C = w.IntText(value = 1)

w_D_L = w.Label('теплопроводность, D:')  
w_D = w.IntText(value = 10)

w_p_L = w.Label('мощность, P:')  
w_p = w.IntText(value = 1000)

w_i_L = w.Label('Интервал')
w_i = w.IntSlider(value = 331, min = 1, max = 500, step = 10)

# w_tstep_L = w.Label('Скорость')
# w_tstep = w.IntSlider(value = 370, min = 10, max = 500, step = 10)

# w_m_L = w.Label('Число кадров')
# w_m = w.IntSlider(value = 50, min=10, max=200, step=10)

btn = w.Button(description = 'Запустить', button_style = 'success') # кнопка

# Обработчик событий, связываем w_btn с bar()
btn.on_click(bar) 

# Свёрстка интер
vbox1 = w.VBox([w_u0_L, w_u0, w_dx_L, w_dx, 
                w_tmax_L, w_tmax, w_dt_L, w_dt]) # виджет контейекр vbox1

vbox2 = w.VBox([w_alpha_L, w_alpha, w_C_L, w_C, 
                w_D_L, w_D, w_p_L, w_p, w_i_L, w_i, btn]) # виджет контейекр vbox2

hbox = w.VBox([vbox1, vbox2])

display(w.HBox([out1, out2]))

# Отобр для польз
with out1:
    display(hbox)


Ответы (0 шт):