matplotlib绘动态图

模拟多智能体编队算法的matplotlib绘图基础框架

 

'''高度一致绘图'''

‘’‘在笛卡尔坐标系下,只考虑高度问题,高度一致即是直线上分布的点缩聚成一点,其次总路径最短的位置在代码中体现’‘’

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import animation

NUM=10   #无人机个体数量
point_list = []      #坐标列表[[1,2],[2,4]]之类的
a=np.random.uniform(0,100,size=NUM) #随机生成x坐标
# b=np.random.uniform(0,100,size=NUM) #随机生成y坐标
b=[50]*NUM  #固定y坐标
for i in range(NUM):
    point_list.append([a[i],b[i]])



"""设置画布和坐标轴"""
fig,ax=plt.subplots()
ax.set_ylim(0,100)
ax.set_xlim(0,100)

class Point():
    def __init__(self,myposition,ax):
        self.myposition=myposition
        self.dot=ax.plot([myposition[0]],[myposition[1]],'bo')[0]

    def gen_dot(self,aim):
        distance=aim-self.myposition[0]
        x = np.linspace(self.myposition, aim, abs(int(distance))) #每帧移动相同距离实现速度一致
        y = 50
        for each in x:
            yield [each, y]

    def update_dot(self,newdot):
        self.dot.set_data(newdot[0], newdot[1])
        return self.dot

    def move(self,aim):
        return animation.FuncAnimation(fig, self.update_dot, frames=self.gen_dot(aim), interval=100)


"""  通过字典实例化多个对象  """
obj_dict = {}
for i in range(NUM):
    obj_dict['R'+str(i)] = Point(myposition=point_list[i],ax=ax)

'''计算最小路径目标点'''
a.sort()
if NUM%2 == 1:
    aim=a[int(NUM/2)]
else:
    aim = a[int(NUM/2)]
ax.plot([aim],[50],'ko',alpha=1)

draw_list=[]
for i in range(NUM):
    R = obj_dict['R'+str(i)]
    draw_list.append(R.move(aim=aim))

plt.show()


''' 由于毕设文章尚未完成,需要等待论文发表之后再公布第二阶段形成均匀多边形编队的代码 '''
''' 也在研究这个方向的朋友们可以一起交流一下  '''
<think>嗯,用户想查找关于使用Matplotlib动态图形的教程,需要示例代码。首先,我应该回忆一下Matplotlib动态图的相关知识。记得Matplotlib有一个animation模块,里面常用的有FuncAnimation和ArtistAnimation。用户可能需要一个简单的例子来入门,比如动态的正弦波或者实时更新的数据。 接下来,我需要检查引用的资料。根据引用[4],里面详细讲解了如何使用FuncAnimation创建动态正弦波,并且提到了保存为MP4文件的方法。这应该是一个很好的起点。用户可能需要核心步骤和代码示例,所以应该整理这部分内容。 然后,考虑用户可能的实际需求。动态图常用于实时数据展示、模拟或动画效果。示例代码应该包括导入库、生成数据、初始化图表、定义更新函数和启动动画。此外,保存动画到文件也是一个常见需求,需要包含相关参数,比如写入器和fps设置。 还要注意代码的注释和可读性,确保用户能够理解每一部分的作用。比如,FuncAnimation的参数:fig是图形对象,func是更新函数,frames是帧数,interval是间隔时间,blit是否优化渲染。这些都需要在解释中说明。 另外,用户可能想知道如何调整动画的效果,比如改变颜色、线条样式或添加标题。可以提到在初始化时设置这些属性。同时,保存动画可能需要安装ffmpeg,这点需要提醒用户,避免他们运行时出错。 最后,确保回答结构清晰,分步骤说明,并列出相关问题帮助用户深入探索。例如,性能优化、实时数据流应用或结合其他库的方法。这样用户可以根据自己的需求进一步学习。</think>### 关于Matplotlib动态图的教程与示例 #### 一、核心实现方法 Matplotlib动态图主要通过`animation`模块实现,核心类是`FuncAnimation`。其原理是通过**逐帧更新数据**实现动画效果,具体步骤如下: 1. **导入必要模块**: ```python import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation ``` 2. **初始化画布和数据**: ```python fig, ax = plt.subplots() x = np.linspace(0, 2*np.pi, 200) line, = ax.plot(x, np.sin(x)) # 初始正弦波 ``` 3. **定义更新函数**: ```python def update(frame): line.set_ydata(np.sin(x + frame/10)) # 每帧偏移相位 return line, ``` 4. **创建动画对象**: ```python ani = FuncAnimation( fig, update, frames=100, # 总帧数 interval=50, # 帧间隔(ms) blit=True # 优化渲染 ) ``` #### 二、完整代码示例(动态正弦波) ```python import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation, PillowWriter # 初始化画布 fig, ax = plt.subplots(figsize=(8,4)) x = np.linspace(0, 4*np.pi, 200) line, = ax.plot(x, np.sin(x), lw=3, color='#FF6B6B') # 设置坐标轴范围 ax.set_xlim(0, 4*np.pi) ax.set_ylim(-1.5, 1.5) # 定义动画更新逻辑 def animate(frame): line.set_ydata(np.sin(x + frame*0.1)) # 相位偏移 ax.set_title(f"Frame: {frame} 相位偏移: {frame*0.1:.1f}rad") return line, # 创建动画 ani = FuncAnimation( fig, animate, frames=120, interval=30, blit=True ) # 保存为GIF ani.save('sine_wave.gif', writer=PillowWriter(fps=15)) plt.show() ``` #### 三、关键参数说明 1. **`frames`参数**: - 可接受整数(总帧数)或迭代器(自定义帧数据) - 示例:`frames=np.linspace(0, 2*np.pi, 100)` 生成连续相位值 2. **保存动画技巧**: ```python ani.save('animation.mp4', writer='ffmpeg', fps=30, # 帧率 dpi=100, # 分辨率 bitrate=1800) ``` *注意:需提前安装FFmpeg环境[^4]* #### 四、进阶应用场景 - 实时传感器数据显示 - 机器学习训练过程可视化 - 物理模拟(如弹簧振动、流体运动) - 动态数据仪表盘(结合Flask/Django)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ColaForced

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值