“ matplotlib-bilibili,抖音很火的动态数据视频自动生成(第三节)-柱形数据视频”
在之前已经告诉大家如何生成会动的数据统计图,这次我们把它应用到数据排行中吧!
01— 柱形图实现
第一步:实现一个最简单柱形统计图
代码语言:javascript复制from matplotlib import pyplot#导入模块
fig, ax = pyplot.subplots()#返回一个包含figure和axes对象的元组,将元组分解为fig和ax两个变量
def graph(num):
ax.barh(1, num, color='#adb0ff') # 绘制水平方向的条形图barh()
ax.barh(3, num, color='#ffb3ff') # 绘制水平方向的条形图barh()
ax.barh(5, num, color='#90d595') # 绘制水平方向的条形图barh()
pyplot.show()
graph(1)
实现结果如图所示:我们绘画了三条统计图。
第二步:给每条柱体加上文字。
代码语言:javascript复制ax.text(num,1, "广东省", size=14, weight=600, ha='right', va='bottom')#添加文字并设置样式
第三步:解决乱码:
这里因为中文会出现乱码,因此我们还需要做出特殊处理
代码语言:javascript复制from pylab import mpl
mpl.rcParams['font.sans-serif'] =["SimHei"]
mpl.rcParams['axes.unicode_minus'] = False
第四步:赋予每条柱形不同的值,使他看起来在变动。
我们这里引入了math模块,随便表示一下好了。
第五步,让我们的数据动起来:
结果发现一个问题,动是动起来了,但是文字还在。如何处理呢。
代码语言:javascript复制from matplotlib import animation
from matplotlib import pyplot
from pylab import mpl
import math
mpl.rcParams['font.sans-serif'] =["SimHei"]
mpl.rcParams['axes.unicode_minus'] = False
fig, ax = pyplot.subplots()#返回一个包含figure和axes对象的元组,将元组分解为fig和ax两个变量
def graph(num):
ax.clear()#清除,不叠加
ax.barh(1, num, color='#adb0ff') # 绘制水平方向的条形图barh()
ax.text(num,1, "广东省", size=14, weight=600, ha='right', va='bottom')#添加文字并设置样式
ax.barh(3, num / math.pi, color='#ffb3ff')
ax.text(num / math.pi, 3, "北京省", size=14, weight=600, ha='right', va='bottom')
ax.barh(5, num/math.tan(1), color='#90d595')
ax.text(num/math.tan(1),5, "云南省", size=14, weight=600, ha='right', va='bottom')
pyplot.title('人口工作情况对比')#添加图标题
animator=animation.FuncAnimation(fig, graph, frames=range(1,100),interval=1)
pyplot.show()#移动到函数外面,不然不会动态显示
我们继续来完善一下,做出动态的效果:
02— 完整代码
注意:保存视频,或者保存图片,需要使用到插件,并设置环境变量。
windows 如何安装ffmpeg
代码语言:javascript复制from matplotlib import animation
from matplotlib import pyplot
from pylab import mpl
import math
mpl.rcParams['font.sans-serif'] =["SimHei"]
mpl.rcParams['axes.unicode_minus'] = False
fig, ax = pyplot.subplots()#返回一个包含figure和axes对象的元组,将元组分解为fig和ax两个变量
def graph(num):
ax.clear()
if num<50:
ax.barh(1, num-1, color='#adb0ff') # 绘制水平方向的条形图barh()
ax.text(num-1,1, "广东省", size=14, weight=600, ha='right', va='bottom')#添加文字并设置样式
ax.barh(3, num 0.1, color='#ffb3ff')
ax.text(num 0.1, 3, "北京省", size=14, weight=600, ha='right', va='bottom')
if num>=50:
ax.barh(1, 50, color='#adb0ff') # 绘制水平方向的条形图barh()
ax.text(50,1, "广东省", size=14, weight=600, ha='right', va='bottom')#添加文字并设置样式
if num<70:
ax.barh(3, num 2, color='#ffb3ff')
ax.text(num 2, 3, "北京省", size=14, weight=600, ha='right', va='bottom')
if num >=70:
ax.barh(3, num-1, color='#ffb3ff')
ax.text(num-1, 3, "北京省", size=14, weight=600, ha='right', va='bottom')
ax.barh(5, num, color='#90d595')
ax.text(num,5, "云南省", size=14, weight=600, ha='right', va='bottom')
pyplot.title('人口工作情况对比')#添加图标题
animator=animation.FuncAnimation(fig, graph, frames=range(1,100),interval=1)
animator.save(filename="数据.gif",writer='pillow')#保存gif
animator.save(filename="数据.mp4")#保存视频
pyplot.show()#移动到函数外才能正常显示
这样,我么就完成了数据动态视频的制作。