今天来用Matplotlib做动图玩玩,怎么让静图变为动图呢?我们现在的看到的电影、电视剧一般是24帧的,也就是每秒24幅图。用Matplotlib做动图也是这个原理用一定数量的静图在一定的时间内播放就能做出动图,原理就是:画图-->清理-->画图


目录:

1、模式选择

2、基本示例

3、动图保存


1、模式选择

在Matplotlib中画图有两种显示模式:

一、阻塞模式,即必须利用plt.show()显示图片,且图片关闭之前代码将阻塞在该行。

二、交互模式,即plt.plot()后立马显示图片,且不阻塞代码的继续运行。

Matplotlib中默认是使用阻塞模式。看一下这里用到的matplotlib中的几个函数:

plt.ion():打开交互模式

plt.ioff():关闭交互模式

plt.clf():清除当前的Figure对象

plt.cla():清除当前的Axes对象

plt.pause():暂停功能


我们就拿上次代码试试看

import numpy as np
import matplotlib.pyplot as plt

plt.ion()
price04 = [16022, 19550, 20176, 22867, 28017, 34064, 47098, 49951, 58837, 68216, 74486]
now_price = [16270, 20131, 21563, 25492, 28666, 34259, 46460, 50081, 65994,  62630, 62358]
percent = []
for i in range(len(price04)):
    percent.append(round(((now_price[i] - price04[i])/price04[i]) * 100, 3))
zone = ['从化', '花都', '增城', '南沙', '黄埔', '番禺', '白云', '荔湾', '海珠', '越秀', '天河']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.bar(zone, percent, color='r', label='涨跌幅度')
for i in range(len(percent)):
    if percent[i] < 0:
        plt.text(zone[i], percent[i]-1, percent[i], ha='center')
    else:
        plt.text(zone[i], percent[i]+1, percent[i], ha='center')
plt.legend()
plt.pause(1)

一开始就打开了交互模式,最后面调用了pause()方法暂停1秒


2、基本示例

案例一:动态柱状图

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots()
y1 = []
for i in range(50):
    y1.append(i)  # 每迭代一次,将i放入y1中画出来
    ax.clear()   # 清除键
    ax.bar(y1, height=y1, width=0.3)
    ax.legend()
    plt.pause(0.1)

运行结果:

b9f72d281687e17622c631ad3281be45.gif

案例二:直线轨迹

import matplotlib.pyplot as plt

x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [5]*11
fig = plt.figure()
ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
x1 = []
tmp = []
for i in range(10):
    # x1.append(i)  # 每迭代一次,将i放入y1中画出来
    ax.clear()  # 清除键
    ax.plot(x, y)
    temp = ax.plot(i, 5, 'ro')
    tmp.append(temp)
    plt.pause(1)

运行结果:

25f1aa67ffe96daae1130aed29808dfc.gif

3、动图保存

import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()
y1 = []
tmp = []
for i in range(10):
    y1.append(i)  # 每迭代一次,将i放入y1中画出来
    temp = ax.bar(y1, height=y1, width=0.3)
    tmp.append(temp)

ani = animation.ArtistAnimation(fig, tmp, interval=200, repeat_delay=1000)
ani.save("柱状图.gif", writer='pillow')

对你有帮助的话给我点个赞呗‎|•'-'•) ✧

Logo

鸿蒙生态一站式服务平台。

更多推荐