python matplotlib绘制动态曲线 数据流可视化

很多时候需要在程序运行过程中,查看一些数据的动态变化,最容易想到的是像opencv那样直接循环使用imshow()形成动态画面,但是由于matplotlib中的显示模式是阻塞模式,在plt.show()之后程序就会暂停在那,打开一个窗口以后必须关掉才能继续执行,这样用matplotlib画动态图就像播放ppt,关闭一个窗口后弹出下一个。关于matplotlib包的任何信息都可以直接在它官网查询。本文总结了几种方法实现在程序运行中绘制动态图的方法,以画动态正弦曲线为例。

第一种方法:plt.show()放在程序最后

既然plt.show会阻塞后面的程序,那么就把plt.show放在程序最后。另外要在每次plot以前清除上次显示结果,并让画图窗口暂停一段时间来显示。

import matplotlib.pyplot as plt
import numpy as np

POINTS = 100
sin_list = [0] * POINTS
indx = 0
# fig, ax = plt.subplots()
while True:
    if indx == 40:
        indx = 0
    indx += 1
    # 更新绘图数据
    sin_list = sin_list[1:] + [np.sin((indx / 20) * np.pi)]
    # 显示时间
    plt.pause(0.01)
    # 清除上一次显示
    plt.cla()
    plt.plot(sin_list)
    #plt.show()如果放在这个位置就会卡住
plt.show() #放在最后不会影响之后的代码执行

第二种方法:用plt.draw()代替plt.show()

还可以用plt.draw()代替plt.show(),plt.draw放置的位置就比较多了,也要在程序中清除上次显示结果,并让画图窗口暂停一段时间来显示,画正弦函数动态图例子如下:

import matplotlib.pyplot as plt
import numpy as np

POINTS = 100
sin_list = [0] * POINTS
indx = 0
# fig, ax = plt.subplots()
while True:
    if indx == 40:
        indx = 0
    indx += 1
    # 更新绘图数据
    sin_list = sin_list[1:] + [np.sin((indx / 20) * np.pi)]
    # 显示时间
    plt.pause(0.01)
    # 清除上一次显示
    plt.cla()
    plt.plot(sin_list)
    # plt.draw()也可以放在这个位置,不会阻塞
plt.draw()

第三种方法:用plt.ion()

另一种方法是在程序前面用plt.ion()开启交互模式,交互模式下plot之后直接显示出来,不再需要用plt.show(),并且显示时画图闪现就继续执行下去,因此也要让窗口暂停一段时间。同样是画正弦函数动态图例子如下:

import matplotlib.pyplot as plt
import numpy as np

POINTS = 100
sin_list = [0] * POINTS
indx = 0
# 开启交互模式
plt.ion()
while True:
    if indx == 40:
        indx = 0
    indx += 1
    # 更新绘图数据
    sin_list = sin_list[1:] + [np.sin((indx / 20) * np.pi)]
    # 显示时间
    plt.pause(0.01)
    # 清除上一次显示
    plt.cla()
    plt.plot(sin_list)

第四种方法:获取句柄

上面代码在更新图像时都是全部重新绘图,包括坐标轴以及曲线,每次更新图像可以只用更新曲线,而不更新坐标轴,这样耗时更短,占用资源最少。方法就是获取曲线句柄,这里用plt.sraw()这种方法来举例,直接上代码:

import matplotlib.pyplot as plt
import numpy as np

POINTS = 100
sin_list = [0] * POINTS
indx = 0

fig, ax = plt.subplots()

# 设置坐标轴信息
ax.set_ylim([-2, 2])
ax.set_xlim([0, POINTS])
ax.set_xticks(range(0, 100, 10))
ax.set_yticks(range(-2, 3, 1))
ax.grid(True)
 
line_sin, = ax.plot(range(POINTS), sin_list)

while True:
    if indx == 40:
        indx = 0
    indx += 1
    # 更新绘图数据
    sin_list = sin_list[1:] + [np.sin((indx / 20) * np.pi)]
    line_sin.set_ydata(sin_list)
    plt.pause(0.01)
    # 不用再调用plot了,也不用再清除上一次显示结果

第五种方法:使用FuncAnimation函数

还有一种使用FuncAnimation函数绘制动态图的方法,官方文档在这。这种方法效率是最高的,但是一旦执行就陷入到更新曲线的函数中去,一直不断循环更新,不能执行其他代码,可以考虑放入一个线程。

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation  # 动图的核心函数
import numpy as np

POINTS = 100
sin_list = [0] * POINTS
indx = 0
 
fig, ax = plt.subplots()

# 设置坐标轴
ax.set_ylim([-2, 2])
ax.set_xlim([0, POINTS])
ax.set_autoscale_on(False)
ax.set_xticks(range(0, 100, 10))
ax.set_yticks(range(-2, 3, 1))
ax.grid(True)
 
line_sin, = ax.plot(range(POINTS), sin_list)
 
 # 用来更新line_sin
def update_line(i):
    global sin_list, line_sin
    sin_list = sin_list[1:] + [np.sin((i / 10) * np.pi)]
    line_sin.set_ydata(sin_list)
    return [line_sin]

ani = FuncAnimation(fig, update_line, interval=100, frames=500)
plt.show()

比较有价值的参考:

https://www.cnblogs.com/zhangwei22/p/9937621.html
https://blog.csdn.net/eaglesimu/article/details/81385910
https://www.cnblogs.com/Shepard/p/9609194.html
https://blog.csdn.net/zbrwhut/article/details/80625702
使用matplotlib制作动态图
Matplotlib绘制动图

  • 10
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python提供了多个库来实现交互式数据可视化展示,其中比较流行的有: 1. Matplotlib:一个基于Python的绘库,可以绘制静态像和动态像。 2. Plotly:一个基于JavaScript的绘库,可以生成交互式表和报告。 3. Bokeh:一个基于JavaScript的绘库,可以生成交互式的Web应用程序。 下面以Matplotlib和Plotly为例,介绍如何实现交互式数据可视化展示。 ## 使用Matplotlib绘制交互式数据可视化展示 Matplotlib提供了多个工具包,其中包括`mpld3`和`bokeh`,可以实现交互式数据可视化展示。 ### 使用mpld3 mpld3是一个Matplotlib的插件,可以将Matplotlib生成的静态像转换为交互式像。 安装mpld3: ```python pip install mpld3 ``` 以下是一个示例代码,可以绘制交互式的散点: ```python import matplotlib.pyplot as plt import mpld3 # 生成数据 x = [1, 2, 3, 4, 5] y = [2, 4, 6, 8, 10] # 绘制散点 fig, ax = plt.subplots() ax.scatter(x, y) # 转换为交互式像 mpld3.show(fig) ``` 运行代码后,会显示一个包含散点的窗口,可以使用鼠标滚轮缩放像,也可以单击数据点查看数据。 ### 使用bokeh bokeh是一个Python的交互式可视化库,可以生成HTML、JavaScript和SVG格式的像。 安装bokeh: ```python pip install bokeh ``` 以下是一个示例代码,可以绘制交互式的散点: ```python from bokeh.plotting import figure, output_file, show # 设置输出文件的路径 output_file("scatter.html") # 生成数据 x = [1, 2, 3, 4, 5] y = [2, 4, 6, 8, 10] # 绘制散点 p = figure() p.scatter(x, y) # 显示像 show(p) ``` 运行代码后,会在当前目录下生成一个名为`scatter.html`的文件,可以用浏览器打开该文件查看交互式散点。 ## 使用Plotly绘制交互式数据可视化展示 Plotly是一个基于JavaScript的绘库,可以生成交互式表和报告。Plotly提供了Python、R、MATLAB和Julia等多个语言的接口。 安装Plotly: ```python pip install plotly ``` 以下是一个示例代码,可以绘制交互式的散点: ```python import plotly.graph_objs as go import plotly.offline as pyo # 生成数据 x = [1, 2, 3, 4, 5] y = [2, 4, 6, 8, 10] # 绘制散点 data = [go.Scatter(x=x, y=y, mode='markers')] # 设置布局 layout = go.Layout(title='Scatter Plot') # 绘制像 fig = go.Figure(data=data, layout=layout) # 显示像 pyo.iplot(fig) ``` 运行代码后,会在浏览器上显示一个交互式散点,可以使用鼠标滚轮缩放像,也可以单击数据点查看数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值