当前位置: 首页 > backend >正文

pycharm的matplotlib不显示动图问题的解决

这里写目录标题

  • 背景
  • 解决办法
    • 方式一
    • 方式二

背景

在使用matplotlib模块研究k-means算法时,创建动画对象,用于展示K-means聚类的迭代过程时,只显示第0帧的图形,而为显示其他帧的图形。
代码如下:

# 5. 动态动画展示
centers_history = np.array(centers_history)
assignments_history = np.array(assignments_history)#创建一个matplotlib图形和坐标轴对象
# 返回值
# `fig`:Figure对象,代表整个图形窗口
# `ax`:Axes对象,代表图形中的坐标轴区域
# 参数说明
# `figsize=(6, 6)`:设置图形大小为6英寸×6英寸(正方形)
fig, ax = plt.subplots(figsize=(6, 6))def update(frame):ax.clear()  # 清除当前帧的图形内容,为绘制新帧做准备labels = assignments_history[frame]  # 获取当前帧对应的数据点分配标签# 从历史记录中获取当前帧的聚类中心坐标# centers_history[frame] 返回第frame次迭代时的聚类中心位置# shape: (n_clusters, n_features) = (2, 2)centers = centers_history[frame]ax.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis', alpha=0.6)ax.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, c='red')ax.set_title(f"第 {frame + 1} 步 - 当前损失: {loss_history[frame]:.2f}", fontproperties=zh_font)# 创建动画对象,用于展示K-means聚类的迭代过程
# fig: matplotlib图形对象
# update: 每一帧调用的更新函数
# frames: 动画总帧数,等于历史记录的长度
# repeat: 是否循环播放动画
# interval: 帧间隔时间(毫秒)
ani = FuncAnimation(fig, update, frames=len(assignments_history), repeat=True, interval=1000)
# 保存动画为GIF文件(可选)
# ani.save('kmeans_animation.gif', writer='pillow', fps=1) #会在当前文件所在目录下生成gif格式图片
plt.show()

先看解决前的效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面的前三张图形,是其他代码里plt.show()显示的图形,这里未列出其代码。最后一张则是我们本次需要讨论的内容,最后一张应该是一个动画。但这里只显示了第一帧的静态图形。
另外:plt.show是阻塞函数,其他图形的窗口未关闭,会阻塞代码继续往下执行。在这里Plots插件做了优化,以非独立窗口的视图效果显示出来,避免了阻塞的效果。后续我们以独立窗口展示的图形的方式时,可以清晰的看到其阻塞效果。
在这里插入图片描述

解决办法

方式一

将动画保存为文件,这样在ani.save时会触发多次回调update方法。将每一帧的图像保存到文件中。
在这里插入图片描述
在这里插入图片描述
动态效果如下:
在这里插入图片描述

方式二

注意:先把方法一种的:

#ani.save(‘kmeans_animation.gif’, writer=‘pillow’, fps=1)
#注释掉 plt.show() #注释放开

以独立窗口展示的方式。设置如下:
IDE–>File–Settings…–>Tools–>Python Plots
在这里插入图片描述
在这里插入图片描述
运行程序看效果:
在这里插入图片描述
当继续弹窗口时,点击右上角的关闭即可。直到我们想要的那个动画图形窗口弹出后,观察其状态。
在这里插入图片描述
可见当前的窗口,在每次切换帧的时候,都会调用一次update方法。
参数: repeat=True, #表示动画重复播放。
参数: interval=1000,#帧间隔时间为1000毫秒
程序也会阻塞到这里,直到手动点击关闭窗口按钮。
在这里插入图片描述

http://www.xdnf.cn/news/18581.html

相关文章:

  • `free` 内存释放函数
  • Linux --网络基础概念
  • 分布式事务的两种解决方案
  • K8s部署MySQL8.0数据库
  • 【大语言模型 17】高效Transformer架构革命:Reformer、Linformer、Performer性能突破解析
  • Baumer高防护相机如何通过Tiny-YOLO单类模型实现人体跌倒检测与跟踪(C#代码UI界面版)
  • 从 UMG 到 Unreal 引擎深层的 UI 定制艺术:Slate 底层 UI 框架简介
  • Python爬虫-解决在抓包的过程中,找不到接口地址的问题
  • 『深度编码』操作系统-进程之间的通信方法
  • 使用dumpbin指令分析Windows下的PE文件(伍)
  • 跨语言文化的统一语义真理:存在性、形式化及其对自然语言处理(NLP)深层语义分析的影响
  • Transformer实战(13)——从零开始训练GPT-2语言模型
  • Redis--day12--黑马点评--附近商铺用户签到UV统计
  • Trip Footprint_Trae Solo模式生成一个旅行足迹App
  • 【卷积神经网络详解与实例】2——卷积计算详解
  • 大模型训练方法全面解析:SFT、RFT、TRPO、DPO、PPO、GRPO、RLH、RLHF技术深度剖析
  • 14.Shell脚本修炼手册--玩转循环结构(While 与 Until 的应用技巧与案例)
  • 题解:P13754 【MX-X17-T3】Distraction_逆序对_前缀和_Ad-hoc_算法竞赛C++
  • java猜数字游戏(赌城主题版)
  • priority_queue和仿函数
  • 【CSP初赛】程序阅读3
  • (一)算法(big O/)
  • 一种解决使用 PotPlayer 播放 Alist 的 Webdav 时提示 无法在 FTP/WebDAV/HTTP 上修改该文件夹 的方法
  • QT-Mysql-查询语句-查询是否有表-表列名-查询记录
  • 【AI基础:神经网络】16、神经网络的生理学根基:从人脑结构到AI架构,揭秘道法自然的智能密码
  • TensorFlow 深度学习 开发环境搭建
  • Java和数据库的关系
  • Ubuntu 的 apt-get 强制使用 IPv4 网络
  • How to Use Managed Identity with ACS?
  • XCVU13P-2FHGB2104E Xilinx(AMD)Virtex UltraScale+ FPGA