使用GridSpec vs pos的带有子图的数据系列动画

时间:2018-11-12 14:20:21

标签: python-3.x animation matplotlib subplot

我有一些数据系列,我想另存为视频。不同的数据系列应该一个接一个地出现,保持前一个系列。最后,所有系列都显示在图中。我想以同步的方式对多个数据系列/子图进行此操作。我希望子图具有不同的大小,因此-据我所知-我需要使用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 :(得分:0)

您需要定义动画功能的gridspec和外部子图。否则,将为每个帧从头开始重新创建它们。

此外,请勿在动画中使用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()