You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ArtistAnimation中实现plt.text标签与颜色同步动态更新

解决Matplotlib ArtistAnimation中文本标签与色块同步更新的问题

问题根源

你的代码中,文本标签仅在动画绘制完成后执行一次labelSquares(),且每帧仅将imshow生成的图像对象加入动画帧列表ims,文本元素并未被纳入动画的帧更新流程,导致标签始终显示最终值,无法随数组变化同步更新。

修改方案

核心思路是:提前创建所有文本标签并保存引用,每次修改数组后更新对应文本的内容,同时将图像对象和所有文本对象一同加入每帧的艺术家列表,让ArtistAnimation能同步更新色块和标签。

修改后的完整代码

import matplotlib.pyplot as plot
import numpy as np
import matplotlib.animation as animation

fig, ax = plot.subplots()  # 修正变量名,避免与matplotlib.pyplot别名冲突

myArray = np.array([[0,  1,  2,   3,  4,  5,  6],
                    [7,  8,  9,  10, 11, 12, 13],
                    [14, 15, 16, 17, 18, 19, 20],
                    [21, 22, 23, 24, 25, 26, 27],
                    [28, 29, 30, 31, 32, 33, 34],
                    [35, 36, 37, 38, 39, 40, 41],
                    [42, 43, 44, 45, 46, 47, 48]])

def randint():
    return np.random.randint(0, 7)

def randNewValue():
    return np.random.randint(0, 48)

# 预创建所有文本标签并保存引用
texts = []
for i in range(7):
    for j in range(7):
        text = ax.text(j, i, myArray[i, j], ha="center", va="center", color="white")
        texts.append(text)

def modifyArrayElement(r, c, x):
    row = r
    col = c
    new_value = x
    myArray[row, col] = new_value
    # 更新对应位置的文本内容
    texts[row*7 + col].set_text(str(new_value))
    return myArray

ims = []

for i in range(100):
    row = randint()
    col = randint()
    newValue = randNewValue()
    # 修改数组并同步更新文本
    modifyArrayElement(row, col, newValue)
    # 获取当前帧的图像对象
    im = ax.imshow(myArray, animated=True)
    # 第一帧初始化静态显示
    if i == 0:
        ax.imshow(myArray)
    # 将图像+所有文本对象加入当前帧的更新列表
    ims.append([im] + texts)

ani = animation.ArtistAnimation(fig, ims, interval=400, blit=True, repeat_delay=5000)

f = r"c://Temp/animation.gif"
writergif = animation.PillowWriter(fps=2)
# ani.save(f, writer=writergif)
plot.show()

关键修改点说明

  1. 变量名规范:把fig, plt = plot.subplots()改为fig, ax = plot.subplots(),避免与matplotlib.pyplot的常用别名plt冲突。
  2. 预创建文本对象:动画开始前一次性生成所有文本标签并存入列表,后续仅需更新内容,无需重复创建,提升效率。
  3. 同步文本更新:在修改数组元素的函数内,立即调用set_text更新对应位置的文本内容,保证数据与标签一致。
  4. 完整帧内容:每帧的更新列表不再只包含图像,而是加入所有文本对象,让ArtistAnimation同步刷新色块和标签。
  5. 冗余代码清理:删除了原代码中重复的imshow调用和仅执行一次的labelSquares()。

内容的提问来源于stack exchange,提问作者user10149299

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 03:42:16