如何使用 FuncAnimation 通过 matplotlib 更新和动画多个图形?

2023-12-22

尝试创建一个程序来读取串行数据并更新多个图形(目前有 1 个折线图和 2 个条形图,但可能会更多)。

现在使用 3 个单独的 FuncAnimation() 调用,但事实证明速度非常慢,这不好,因为我仍然需要在将来添加更多动画人物的选项。

那么我怎样才能使它成为一个单一的 FuncAnimation (或者类似的东西)来更新所有三个(可能更多)数字呢?或者,我可以做些什么来加快速度呢?

#figure for current
amps = plt.figure(1)
ax1 = plt.subplot(xlim = (0,100), ylim = (0,500))
line, = ax1.plot([],[])
ax1.set_ylabel('Current (A)')

#figure for voltage
volts = plt.figure(2)
ax2 = plt.subplot()
rects1 = ax2.bar(ind1, voltV, width1)
ax2.grid(True)
ax2.set_ylim([0,6])
ax2.set_xlabel('Cell Number')
ax2.set_ylabel('Voltage (V)')
ax2.set_title('Real Time Voltage Data')
ax2.set_xticks(ind1)

#figure for temperature
temp = plt.figure(3)
ax3 = plt.subplot()
rects2 = ax3.bar(ind2, tempC, width2)
ax3.grid(True)
ax3.set_ylim([0,101])
ax3.set_xlabel('Sensor Number')
ax3.set_ylabel('temperature (C)')
ax3.set_title('Real Time Temperature Data')
ax3.set_xticks(ind2)

def updateAmps(frameNum):

    try:
    #error check for bad serial data
        serialString = serialData.readline()
        serialLine = [float(val) for val in serialString.split()]
        print (serialLine)

        if (len(serialLine) == 5):
            voltV[int(serialLine[1])] = serialLine[2]
            tempC[int(serialLine[3])] = serialLine[4]
            currentA.append(serialLine[0])
            if (len(currentA)>100):
                currentA.popleft()

        line.set_data(range(100), currentA)

    except ValueError as e:
    #graphs not updated for bad serial data
        print (e)

    return line,

#function to update real-time voltage data
def updateVolts(frameNum):

    for rects, h in zip(rects1,voltV):
        rects.set_height(h)

    return rects1

#function to update real-time temperature data
def updateTemp(frameNum):

    for rects, h in zip(rects2,tempC):
        rects.set_height(h)

    return rects2

调用 funcAnimation:

anim1 = animation.FuncAnimation(amps, updateAmps,
                                interval = 20, blit = True)
anim2 = animation.FuncAnimation(volts, updateVolts, interval = 25, blit = True)
anim3 = animation.FuncAnimation(temp, updateTemp, interval = 30, blit = True)

呼应 @ImportanceOfBeingErnest 的评论,显而易见的解决方案是使用 3 个子图,并且仅使用一个FuncAnimation()称呼。您只需确保回调函数返回要在每次迭代时更新的所有艺术家的列表。

一个缺点是更新将在所有 3 个子图中以相同的时间间隔进行(与示例中的不同时间相反)。您可以通过使用全局变量来解决这个问题,该变量计算函数被调用的次数,并且仅每隔一段时间绘制一些图。

#figure 
fig = plt.figure(1)
# subplot for current
ax1 = fig.add_subplot(131, xlim = (0,100), ylim = (0,500))
line, = ax1.plot([],[])
ax1.set_ylabel('Current (A)')

#subplot for voltage
ax2 = fig.add_subplot(132)
rects1 = ax2.bar(ind1, voltV, width1)
ax2.grid(True)
ax2.set_ylim([0,6])
ax2.set_xlabel('Cell Number')
ax2.set_ylabel('Voltage (V)')
ax2.set_title('Real Time Voltage Data')
ax2.set_xticks(ind1)

#subplot for temperature
ax3 = fig.add_subplot(133)
rects2 = ax3.bar(ind2, tempC, width2)
ax3.grid(True)
ax3.set_ylim([0,101])
ax3.set_xlabel('Sensor Number')
ax3.set_ylabel('temperature (C)')
ax3.set_title('Real Time Temperature Data')
ax3.set_xticks(ind2)

def updateAmps(frameNum):

    try:
    #error check for bad serial data
        serialString = serialData.readline()
        serialLine = [float(val) for val in serialString.split()]
        print (serialLine)

        if (len(serialLine) == 5):
            voltV[int(serialLine[1])] = serialLine[2]
            tempC[int(serialLine[3])] = serialLine[4]
            currentA.append(serialLine[0])
            if (len(currentA)>100):
                currentA.popleft()

        line.set_data(range(100), currentA)

    except ValueError as e:
    #graphs not updated for bad serial data
        print (e)

    return line,

#function to update real-time voltage data
def updateVolts(frameNum):

    for rects, h in zip(rects1,voltV):
        rects.set_height(h)

    return rects1

#function to update real-time temperature data
def updateTemp(frameNum):

    for rects, h in zip(rects2,tempC):
        rects.set_height(h)

    return rects2

def updateALL(frameNum):
    a = updateAmps(frameNum)
    b = updateVolts(frameNum)
    c = updateTemp(frameNum)
    return a+b+c

animALL = animation.FuncAnimation(fig, updateALL,
                                interval = 20, blit = True)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 FuncAnimation 通过 matplotlib 更新和动画多个图形? 的相关文章

  • 使用特定的类/函数预加载 Jupyter Notebook

    我想预加载一个笔记本 其中包含我在另一个文件中定义的特定类 函数 更具体地说 我想用 python 来做到这一点 比如加载一个配置文件 包含所有相关的类 函数 目前 我正在使用 python 生成笔记本并在服务器上自动启动它们 因为不同的
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • Python 中的哈希映射

    我想用Python实现HashMap 我想请求用户输入 根据他的输入 我从 HashMap 中检索一些信息 如果用户输入HashMap的某个键 我想检索相应的值 如何在 Python 中实现此功能 HashMap
  • 将html数据解析成python列表进行操作

    我正在尝试读取 html 网站并提取其数据 例如 我想查看公司过去 5 年的 EPS 每股收益 基本上 我可以读入它 并且可以使用 BeautifulSoup 或 html2text 创建一个巨大的文本块 然后我想搜索该文件 我一直在使用
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • Pandas/Google BigQuery:架构不匹配导致上传失败

    我的谷歌表中的架构如下所示 price datetime DATETIME symbol STRING bid open FLOAT bid high FLOAT bid low FLOAT bid close FLOAT ask open
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • pip 列出活动 virtualenv 中的全局包

    将 pip 从 1 4 x 升级到 1 5 后pip freeze输出我的全局安装 系统 软件包的列表 而不是我的 virtualenv 中安装的软件包的列表 我尝试再次降级到 1 4 但这并不能解决我的问题 这有点类似于这个问题 http
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 为什么 Pickle 协议 4 中的 Pickle 文件是协议 3 中的两倍,而速度却没有任何提升?

    我正在测试 Python 3 4 我注意到 pickle 模块有一个新协议 因此 我对 2 个协议进行了基准测试 def test1 pickle3 open pickle3 wb for i in range 1000000 pickle
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • NHibernate - CreateCriteria 与 CreateAlias

    假设以下场景 class Project public Job Job class Job public Name 假设我想使用 Criteria API 搜索其 Job 名称为 sumthing 的所有项目 我可以使用 CreateAli

随机推荐

  • 使用 HTML5 拖放,有没有一种方法可以在保持拖放流的同时从视图中隐藏元素

    我正在努力通过创建一个指示器 拖动元素的轮廓 来改进拖放实现 当您在网格中拖动和移动时 该指示器沿着设置的柔性网格移动 在当前的实现中 拖动的元素就位 当我放在放置目标上时 它会更新弹性顺序 我想要做的是完全隐藏元素 以便更好地视觉提示元素
  • Oracle(空间几何)查询的问题

    我正在尝试使用 SDO WITHIN DISTANCE 形成一个查询 返回给定矩形内的实体列表 我所做的查询似乎应该有效 但 Oracle 给了我一些奇怪的错误 这是查询 SELECT FROM TBLENTITYLOCATION TL I
  • 使对象的属性可迭代

    我返回一个包含具有多个属性的对象的列表 如下所示 results q fetch 5 for p in results print s s d inches tall p first name p last name p height 是否
  • Xcode 错误:Outlet 无法连接到重复内容

    经过一些搜索和编辑后 我似乎找不到解决此错误的解决方案 我正在尝试将位置搜索结果与表格链接起来 以列表形式显示搜索结果 我的地图上有详细信息按钮 该按钮与名为 FirstViewController 的 UIViewController 链
  • Google Native Client,将二进制数据从 NACL 发送到前端

    如何发送二进制数据 例如mp3 mp4数据返回前端 我知道有两种方法可以做到这一点 利用NACL提供的沙箱文件系统并在前端获取url 将数据通过PostMessage using VarArrayBuffer 如果有人能给我一个如何传递二进
  • 数据流程图和流程图有什么区别?

    我想知道为什么我们使用数据流程图而不是流程图 流程图详细说明了流程跟随 DFD 详细说明了流程data通过一个系统 在流程图中 箭头表示元素之间的控制 而不是数据 转移 元素是指令或决策 或I O等 在 DFD 中 箭头实际上是元素之间的数
  • QImage 在 PNG 中设置 alpha 透明度

    我正在尝试在另一个图像上绘制图像 并且该部分有效 但在绘制覆盖图像之前我想降低它的不透明度 这就是我遇到麻烦的地方 我的叠加图像是PNG的 它们本身有透明区域 否则它们的内容是黑色的 在 Qt 中 我循环遍历每个像素 但无法确定像素是否透明
  • 下拉值未使用 ajax 传递到控制器

    我需要使用 ajax 将下拉列表中的值传递到控制器 但显然 这不起作用 该值显示为空 我需要传递的值 kodeCabang到控制器 我该如何做这份工作 HTML代码如下 div class dropdown div
  • 具有多种形式的 Django-TinyMCE

    我正在尝试创建一个包含多个 TinyMCE 编辑器实例的 HTML 页面 编辑的数量根据要求而变化 所以我无法枚举它们并单独初始化它们 这是我的代码 视图 py from tinymce widgets import TinyMCE cla
  • 将 ASP.NET vNext 应用程序部署到 Azure 云服务

    是否可以将 ASP NET vNext Web 应用程序部署到 Azure 云服务 如果是 那么它是构建在 aspnet50 还是 aspnetcore50 框架上有什么关系吗 Azure 云服务 Visual Studio 模板即使在 2
  • git 无法拉取远程更改

    由于以下错误 我无法从远程存储库中提取更改 我正在尝试从该存储库的主分支中提取数据 c supportal gt git pull error cannot lock ref refs remotes origin KANBAN unabl
  • Jaxb 解组不起作用

    我有这个 xml 文件
  • 如何为 iOS 分发创建 P12 证书

    我们有一款 iOS 应用程序 其推送通知证书已过期 我们正在尝试创建一个新的证书 我已在配置门户 ios developer cer ios distribution cer 中创建了新证书并下载了它们 我按照指示进行在 Stack Ove
  • 如何禁用 EditText 软件键盘上的“下一步”按钮(替换为“完成”按钮)

    我的 Android 应用程序中有一堆 EditText 每个 EditText 的 InputMethod 设置为 numberSigned 我的目标设备没有硬件键盘 而是使用软件键盘进行数字输入 Android 将输入框右侧的标准 完成
  • 如何在 swift 中 http 发布特殊字符

    我使用以下命令将电子邮件和密码发布到我的服务器 php 脚本 我遇到的问题是密码包含一个特殊字符 特别是 符号 似乎正在被剥离 我认为是因为它认为它的分隔变量被传递 我怎样才能传递这个字符而不剥离它 let myURL NSURL stri
  • scrapyd部署显示0个蜘蛛

    我正在使用 scrapy 进行项目 我运行了以下命令来部署项目 scrapy deploy l 然后我得到以下o p 刮刮网站http localhost 6800 cat scrapy cfg settings default scrap
  • List.Contains 返回 false,尽管看起来它应该返回 true

    Sub pageload Handles Me Load Dim bom As New List Of Car Dim car1 As New Car With Name Pea Year 2 Dim car2 As New Car Wit
  • 如何实现用户以安全的方式发布一些 html 格式的数据的可能性?

    我有一个textarea我想支持发布数据的一些最简单的格式 至少是空格和换行符 我怎样才能实现这个目标 如果我不逃避响应并保留一些 html 标签 那么这将是一个很大的安全漏洞 但我没有看到任何其他允许在浏览器中进行文本格式化的解决方案 所
  • 从 Assets 文件夹加载 CSS JS

    我已经花了几个小时寻找解决方案 虽然也有类似的情况 但我认为有点不同 我有一个正在加载到 webview 中的网站 setContentView R layout activity main WebView myWebView WebVie
  • 如何使用 FuncAnimation 通过 matplotlib 更新和动画多个图形?

    尝试创建一个程序来读取串行数据并更新多个图形 目前有 1 个折线图和 2 个条形图 但可能会更多 现在使用 3 个单独的 FuncAnimation 调用 但事实证明速度非常慢 这不好 因为我仍然需要在将来添加更多动画人物的选项 那么我怎样