Анимация серии данных с использованием сюжетов с использованием GridSpec vs pos - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть ряд рядов данных, которые я хочу сохранить как видео.Различные ряды данных должны появляться один за другим, сохраняя прежний ряд.В конце концов все серии показаны на сюжете.Я хочу сделать это с несколькими рядами данных / графиками синхронным способом.Я хочу, чтобы участки имели разные размеры, поэтому, насколько я понял, мне нужно сделать это с помощью GridSpec.Тем не менее, с GridSpec я не могу сохранить старые серии при добавлении новых (я получаю только последние серии данных).

Пример моего кода (показывает принцип - мой подлинный сценарий более сложный): Работа с индексом / положением (но только на равных участках):

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

figure = plt.figure()

data = np.array([1,2,3,4,5])
set = np.array([1,2,3,4])

def make_frame(i):
    ax1 = plt.subplot(121)
    x = data
    y = i*x
    ax1.set_ylim(0,25)
    ax1.plot(x,y)

    ax2 = plt.subplot((122), sharey = ax1)
    a = data*2
    b = i/x*3
    ax2.plot(a,b) 

    plt.pause(1)

ani = anim.FuncAnimation(figure, make_frame, frames = set, repeat = False)

plt.show()

Не сохраняетсястарые серии (но с возможностью настройки количества столбцов / строк для каждого графика):

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as anim
from matplotlib.gridspec import GridSpec


figure = plt.figure()

data = np.array([1,2,3,4,5])
set = np.array([1,2,3,4])

print(data,set)

def make_frame(i):
    gs1 = GridSpec(1,2)

    ax1 = plt.subplot(gs1[0,0])
    x = data
    y = i*x
    ax1.plot(x,y)

    ax2 = plt.subplot(gs1[0,1], sharey = ax1)
    a = data
    b = i/x*3
    ax2.plot(a,b)

    ax1.set_ylim(0,25)

    plt.pause(0.5)

ani = anim.FuncAnimation(figure, make_frame, frames = set, repeat = False)

plt.show()

Как сохранить «историю построения» в решении GridSpec?

1 Ответ

0 голосов
/ 12 ноября 2018

Вам необходимо определить сетку и вспомогательные участки вне функции анимации.В противном случае они воссоздаются с нуля для каждого кадра.

Кроме того, не используйте plt.pause в анимации, а вместо этого используйте аргумент interval.И не используйте имена функций Python (set) в качестве имен переменных.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as anim
from matplotlib.gridspec import GridSpec

data = np.array([1,2,3,4,5])
seti = np.array([1,2,3,4])


gs1 = GridSpec(1,2)
figure = plt.figure()
ax1 = plt.subplot(gs1[0,0])
ax2 = plt.subplot(gs1[0,1], sharey = ax1)
ax1.set_ylim(0,25)

print(data,seti)

def make_frame(i):
    x = data
    y = i*x
    ax1.plot(x,y)

    a = data
    b = 3.*i/x
    ax2.plot(a,b)

ani = anim.FuncAnimation(figure, make_frame, frames = seti, 
                         interval =500, repeat = False)

plt.show()
...