Matplotlib动画绘制没有blit的动态艺术家

时间:2017-12-01 15:11:47

标签: python python-3.x animation matplotlib

我正在尝试在动画的更新功能中绘制动态数量的艺术家。具体来说,我想标记移动功率谱密度图的峰值。无法保证峰值的数量是相同的,因此我不能使用text.set_text,这是我使用的:

def update(i):
    global line, frequency, psdmatrix, text, recordline, ax
    text.set_text('Period ' + str(i))
    line.set_data(frequency, psdmatrix[i])
    maxlist = get_max(psdmatrix[i])
    texts = []
    for each in maxlist:
        freq = frequency[each[0]]
        texts.append(ax.text(freq, each[1]*3, 'Peak %.02f' % freq))
    return line, recordline, texts

然而,文本并没有在每次迭代中清除自己,而是相互叠加,几次迭代就有数百个文本艺术家。有没有一种有效的方法可以摆脱文本而不去除其他更稳定的元素?我在Mac上,所以我不能使用blit = True。生成的图像如下:

All the texts objects are on top of each other

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以在创建新文本之前从图中删除旧文本。 在函数外部定义texts并迭代它以删除和删除旧文本。因此,以下内容适用于blit=False

texts = []

def update(i):
    global line, frequency, psdmatrix, text, recordline, ax
    text.set_text('Period ' + str(i))
    line.set_data(frequency, psdmatrix[i])
    maxlist = get_max(psdmatrix[i])
    for t in texts:
        t.remove()
        del t
    texts[:] = []
    for each in maxlist:
        freq = frequency[each[0]]
        texts.append(ax.text(freq, each[1]*3, 'Peak %.02f' % freq))

(请注意,由于缺少mcve,这是未经测试的。)