目录
一、引言
用python做仿真一个痛点就是不能像netlogo等一些其他软件可以很方便地实现实时数据可视化,也正是由于这一点,调试仿真系统时不够直观。因此,掌握如何根据仿真系统即时生成的数据绘制动态图形很重要。
已经有几位博主给出了详细的博文,这里给大家列举出来。为了增加点新东西,
本文对实现实时数据动态显示的代码做出一些解析
,方便大家读懂代码。
python中plot实现即时数据动态显示方法_plt实时显示_windSeS的博客-CSDN博客
https://blog.csdn.net/u013468614/article/details/58689735
python matplotlib.pyplot如何绘制实时图表?(实时绘制、更新图表、实时更新、动态窗口)plt.ion() plt.clf() plt.pause() plt.ioff()_python pyplot 实时 图_Dontla的博客-CSDN博客
https://blog.csdn.net/Dontla/article/details/106559106
matplotlib 绘制实时动态曲线图_颹蕭蕭的博客-CSDN博客
https://blog.csdn.net/itnerd/article/details/109062516
二、从一块代码开始
import matplotlib
from matplotlib import pyplot as plt
import numpy as np
%matplotlib qt5#在spyder等集成开发环境中改为matplotlib.use('QtAgg')
# 创建实时绘制横纵轴变量
x = []
y = []
# 创建绘制实时损失的动态窗口
plt.ion()
# 创建循环
for i in range(30):
x.append(i)# 添加i到x轴的数据中
y.append(i**2)# 添加i的平方到y轴的数据中
plt.clf() # 清除之前画的图
plt.plot(x, y * np.array([-1])) # 画出当前x列表和y列表中的值的图形
plt.pause(0.001) # 暂停一段时间,不然画的太快会卡住显示不出来
plt.ioff() # 关闭画图窗口
上述代码
循环产生i和i的平方
,并将循环产生的数据交给plt绘制曲线图。正常情况下,曲线图会一张一张的绘制出来,关键就在于
%matplotlib qt5和plt.icon()
。
1、%matplotlib qt5
`%matplotlib qt5`
是一个Jupyter Notebook的
魔术命令
,用于在
Qt5后端
中显示Matplotlib生成的图形。Matplotlib是一个用于数据可视化的Python库,而
Qt5是一个跨平台的用户界面工具包
。
当你在Jupyter Notebook中使用Matplotlib绘制图形时,
默认情况下,图形会以静态图片的形式显示
在Notebook中。但是,有时候你可能希望以交互方式显示图形,以便更好地探索和操作图形。这时就可以使用
`%matplotlib qt5`
命令。
该命令会将Matplotlib的后端设置为Qt5
,这意味着Matplotlib会使用Qt5库来创建一个独立的图形窗口,将图形显示在其中。这个窗口是一个可交互的界面,你可以缩放、平移、旋转和保存图形等操作。
使用
`%matplotlib qt5`
命令后,当你调用Matplotlib的绘图函数时,
图形将会在一个独立的窗口中显示
,而不是在Notebook中直接显示。这使得你可以
更方便地探索和交互地操作图形,特别是对于复杂的图形和大量的数据点
。
另外,如果你想恢复到默认的静态图形显示方式,可以使用
`%matplotlib inline`
命令。这将把Matplotlib的后端设置为内联模式,图形将再次以静态图片的形式显示在Notebook中。
2、plt.icon
plt.ion()
是 Matplotlib 库中的一个函数,
用于开启交互模式(interactive mode)
。它可以让图形在绘制后立即显示,而不需要等待plt.show() 的调用。
在默认情况下,Matplotlib 的绘图操作是阻塞的,即在调用 plt.show()之前,代码会一直阻塞在绘图函数处,直到手动关闭图形窗口后才会继续执行后续代码。
这种模式适用于静态图形展示,但不适合需要实时更新图形的交互式应用场景。
使用
plt.ion()
函数可以将 Matplotlib 设置为交互模式,开启非阻塞的绘图操作。这意味着
在调用绘图函数后,图形会立即显示在窗口中,然后代码会继续执行后续的操作,而不需要显式地调用 plt.show()
。当更新图形时,新的图形会立即在窗口中显示,无需手动关闭图形窗口。
调用
plt.ioff()
可以关闭交互模式。
上述内容针对非IPython的开发环境,在Jupyter Notebook中,即使没有plt.ion()图形也可以实时显示而不需要plt.show(),也不需要手动关闭绘图窗口以使代码继续运行。
三、另一种在行内(Jupyter Notebook内)展示动态图形的方法
from matplotlib import pyplot as plt
import numpy as np
from IPython import display
%matplotlib inline
# 创建实时绘制横纵轴变量
x = []
y = []
# 创建绘制实时损失的动态窗口
plt.ion()
# 创建循环
for i in range(30):
x.append(i)# 添加i到x轴的数据中
y.append(i**2)# 添加i的平方到y轴的数据中
plt.clf() # 清除之前画的图
plt.plot(x, y * np.array([-1])) # 画出当前x列表和y列表中的值的图形
plt.pause(0.001) # 暂停一段时间,不然画的太快会卡住显示不出来
display.clear_output(wait=True)
plt.ioff() # 关闭画图窗口
使用上述代码即可实现在Jupyter Notebook内展示动态图形,其关键在于
IPython
中的
display.clear_output()
。
1、display和display.clear_output()
display是用于在IPython环境下进行交互式显示和操作的模块,
IPython是一个增强版的交互式Python解释器
,它提供了许多
用于交互式计算和数据可视化
的功能。Jupyter Notebook就是基于IPython内核的。
导入`display`模块后,你可以使用其中的函数来实现一些特定的显示操作,例如:
1. `display.display()`: 用于在IPython中显示对象。它会自动选择适当的显示方式,可以显示图像、HTML内容、Markdown文本、Pandas数据框等等。它在Jupyter Notebook中常用于在代码中间或循环中实时显示结果。
2. `display.clear_output()`: 清除IPython输出区域的内容,用于清除之前的输出,以便进行新的显示。
3. `display.HTML()`: 显示HTML内容,可以用于在IPython中嵌入并展示富文本内容或交互式组件。
4. `display.Image()`: 显示图像文件,可以在IPython中显示本地或远程图像文件。
5. `display.Audio()`: 播放音频文件,可以在IPython中播放本地或远程音频文件。
6. `display.Video()`: 播放视频文件,可以在IPython中播放本地或远程视频文件。
这些函数提供了一种灵活的方式来处理不同类型的数据和内容,并以交互式方式在IPython环境中进行显示。它们对于数据分析、实验结果展示和交互式演示等场景非常有用。
display.clear_output(wait=True)
是display模块中的函数,用于在IPython环境中清除输出区域的内容,
wait=True
表示直到下一次输出产生时才清除原本输出区域的内容。
这样做类似于动画中的帧,不断刷新的帧让人感觉是连续变化的动态图形。
需要注意的是,
display.clear_output(wait=True) 函数只能在IPython环境中使用
,例如Jupyter Notebook或IPython终端。在其他Python环境中,如普通的Python脚本或命令行交互式解释器中,该函数将不起作用。