Как сохранить Диаграмму

Сделала вот такую диаграмму:

import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from PIL import Image

# Цвета
chart_0 = '#eeee11'
facecolor_fig = '#000'
day_of_week = 7

frame_files = ['fr/frame_0001.png', 'fr/frame_0002.png', 'fr/frame_0003.png', 'fr/frame_0004.png', 'fr/frame_0005.png',
           'fr/frame_0006.png', 'fr/frame_0007.png', 'fr/frame_0008.png', 'fr/frame_0009.png', 'fr/frame_0010.png',
           'fr/frame_0011.png', 'fr/frame_0012.png', 'fr/frame_0013.png', 'fr/frame_0014.png', 'fr/frame_0015.png',
           'fr/frame_0016.png', 'fr/frame_0017.png', 'fr/frame_0018.png', 'fr/frame_0019.png', 'fr/frame_0020.png',
           'fr/frame_0021.png', 'fr/frame_0022.png', 'fr/frame_0023.png', 'fr/frame_0024.png', 'fr/frame_0025.png',
           'fr/frame_0026.png', 'fr/frame_0027.png', 'fr/frame_0028.png', 'fr/frame_0029.png', 'fr/frame_0030.png',
           'fr/frame_0031.png', 'fr/frame_0032.png', 'fr/frame_0033.png', 'fr/frame_0034.png', 'fr/frame_0035.png',
           'fr/frame_0036.png', 'fr/frame_0037.png', 'fr/frame_0038.png', 'fr/frame_0039.png', 'fr/frame_0040.png',
           'fr/frame_0041.png', 'fr/frame_0042.png', 'fr/frame_0043.png', 'fr/frame_0044.png', 'fr/frame_0045.png',
           'fr/frame_0046.png', 'fr/frame_0047.png', 'fr/frame_0048.png', 'fr/frame_0049.png', 'fr/frame_0050.png',
           'fr/frame_0051.png', 'fr/frame_0052.png', 'fr/frame_0053.png', 'fr/frame_0054.png', 'fr/frame_0055.png',
           'fr/frame_0056.png', 'fr/frame_0057.png', 'fr/frame_0058.png', 'fr/frame_0059.png', 'fr/frame_0060.png',
           'fr/frame_0061.png', 'fr/frame_0062.png', 'fr/frame_0063.png', 'fr/frame_0064.png', 'fr/frame_0065.png',
           'fr/frame_0066.png', 'fr/frame_0067.png', 'fr/frame_0068.png', 'fr/frame_0069.png', 'fr/frame_0070.png',
           'fr/frame_0071.png', 'fr/frame_0072.png', 'fr/frame_0073.png', 'fr/frame_0074.png', 'fr/frame_0075.png',
           'fr/frame_0076.png', 'fr/frame_0077.png', 'fr/frame_0078.png', 'fr/frame_0079.png', 'fr/frame_0080.png']

weekly_score_all = [[0, 0, 0], [2, 6, 3], [4, 9, 7], [6, 12, 10],
                [8, 15, 17], [11, 21, 21], [14, 25, 25], [18, 31, 30]]

# Данные для диаграммы
search = ['Lena', 'Alice', 'Ivan']
num = max(weekly_score_all[7]) * 1.02
search_num = [num * 0.12, num * 0.39, num * 0.66]

# Поле и оси
fig, ax = plt.subplots(figsize=(5, 7.0),
                       layout='tight',
                       num=f'WINNER!!!')
# Размещение окна Windows
fig.canvas.manager.window.wm_geometry('+0+0')

# Название диаграммы
fig.suptitle('Week 20! Who will win?', color=chart_0, size=20)

# Диаграмма
bar_container = plt.bar(search_num, weekly_score_all[0],
                        num * 0.24, color=chart_0, alpha=.8)
# Цвет окна
fig.set(facecolor=facecolor_fig)
# Установка прозрачного фона
ax.set_facecolor('none')
# Скрываем оси и метки
ax.spines.right.set_visible(False)
ax.spines.top.set_visible(False)
ax.spines.left.set_visible(False)
ax.spines.bottom.set_visible(False)
ax.set_xticks([])
ax.set_yticks([])
# Устанавливаем предел
ax.set_ylim([0, num])

# Список для хранения текстовых меток
scores = []
players = []

# Инициализация текстовых меток для каждого столбца
for bar, weekly_score, player_name in (
        zip(bar_container, weekly_score_all[0], search)):
    score = ax.text(bar.get_x() + bar.get_width() / 2, 0,
                    f'{weekly_score}', ha='center', fontfamily='sans-serif',
                    va='top', color='#333', fontsize=36, fontweight=500)
    player = ax.text(bar.get_x() + bar.get_width() / 2, 0,
                     f'{player_name}', ha='center', fontfamily='monospace',
                     va='bottom', color='#333', fontsize=13, fontweight=900)
    # добавляем текстовую метку в список
    scores.append(score)
    players.append(player)


# Анимация 1 - Столбцы
def animate1(q):
    for bar_anim, weekly_score_anim, player_name_anim, score_anim, player_anim in (
            zip(bar_container, weekly_score_all[q], search, scores, players)):
        bar_anim.set_height(weekly_score_anim)
        # Обновляем положение текстовой метки
        if q > num / day_of_week:
            player_anim.set_y(weekly_score_anim - num * 0.06)
            score_anim.set_y(weekly_score_anim - num * 0.07)
        else:
            score_anim.set_y(num * 0.08)
            player_anim.set_y(num * 0.09)
        # Обновляем текст метки
        score_anim.set_text(f'{weekly_score_anim}')
        player_anim.set_text(f'{player_name_anim}')
    return bar_container


# Видео
def animate2(q):
    imgQ = Image.open(frame_files[q])
    ax.imshow(imgQ, extent=(0.0, 0.78 * num,  # По горизонтали
                            0.0, num))        # По вертикали)
    return bar_container


# Анимация 1
ani1 = animation.FuncAnimation(fig, animate1, frames=len(weekly_score_all),
                               blit=False, interval=1500, repeat=False)

# Анимация 2
ani2 = animation.FuncAnimation(fig, animate2, frames=len(frame_files),
                           blit=False, interval=100, repeat=False)

# Сохранение анимации
ani1.save(filename="animation1.mp4", writer="ffmpeg")
# Включите когда будете готовы. Занимает 1-3 мин времени!!!
# ani2.save(filename="animation2.mp4", writer="ffmpeg")

plt.show()

В TkAgg все выводится без проблем, чуть-чуть притормаживает, ну это просто комп тормозит. Мне эту презентацию нужно выложить в Телеграмм как обычное видео... И вот здесь начинается самое интересное. Объединить две анимации в одну не получается, разный interval=1500 и 100, а выводить сразу обе тоже не выходит!


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