通常大家做出来的图表,绝大部分都是静态的,有时会显得不够吸引人 。
今天小F就给大家介绍一下,如何用Python绘制动态图表 。
主要是使用到Matplotlib+imageio,其中Matplotlib就有一个Animation类,可以生成动图GIF,不过使用起来学习成本较高,还是有一定难度的 。
文章插图
【太强了,用Python制作动态可视化图表】
这里我将先创建静态图表的图片,然后使用Imageio创建一个GIF(动态图表) 。
一共给大家介绍三种动态图表的绘制,折线图,条形图,散点图 。
01 折线图
先来绘制一个简单的折线图看看 。
import osimport numpy as npimport matplotlib.pyplot as pltimport imageio# 生成40个取值在30-40的数y = np.random.randint(30, 40, size=(40))# 绘制折线plt.plot(y)# 设置y轴最小值和最大值plt.ylim(20, 50)# 显示plt.show()
使用Numpy创建一个数值范围在30到40之间的随机整数列表,结果如下 。文章插图
下面将对整数列表进行切片,生成不同阶段的图表 。
# 第一张图plt.plot(y[:-3])plt.ylim(20, 50)plt.savefig('1.png')plt.show()# 第二张图plt.plot(y[:-2])plt.ylim(20, 50)plt.savefig('2.png')plt.show()# 第三张图plt.plot(y[:-1])plt.ylim(20, 50)plt.savefig('3.png')plt.show()# 第四张图plt.plot(y)plt.ylim(20, 50)plt.savefig('4.png')plt.show()
得到x轴为0:36、0:37、0:38、0:39四个折线图表 。文章插图
有了这四张图,我们就可以使用Imageio生成GIF了 。
# 生成Gifwith imageio.get_writer('mygif.gif', mode='I') as writer: for filename in ['1.png', '2.png', '3.png', '4.png']: image = imageio.imread(filename) writer.Append_data(image)
动图来了 。文章插图
一个会动的折线图表就制作出来了,不过不是从x轴坐标为0的时候开始的 。
filenames = []num = 0for i in y: num += 1 # 绘制40张折线图 plt.plot(y[:num]) plt.ylim(20, 50) # 保存图片文件 filename = f'{num}.png' filenames.append(filename) plt.savefig(filename) plt.close()# 生成gifwith imageio.get_writer('mygif.gif', mode='I') as writer: for filename in filenames: image = imageio.imread(filename) writer.append_data(image)# 删除40张折线图for filename in set(filenames): os.remove(filename)
绘制出40张折线图,并且保存图片,生成GIF 。文章插图
可以看到折线图的x坐标从0一直到了40 。
02 条形图
上面的折线图每次只有一个y值即可,而条形图则需要所有的y值,如此所有的条形才能同时移动 。
给X轴创建固定值,Y轴创建列表,并使用Matplotlib的条形图函数 。
x = [1, 2, 3, 4, 5]coordinates_lists = [[0, 0, 0, 0, 0], [10, 30, 60, 30, 10], [70, 40, 20, 40, 70], [10, 20, 30, 40, 50], [50, 40, 30, 20, 10], [75, 0, 75, 0, 75], [0, 0, 0, 0, 0]]filenames = []for index, y in enumerate(coordinates_lists): # 条形图 plt.bar(x, y) plt.ylim(0, 80) # 保存图片文件 filename = f'{index}.png' filenames.append(filename) # 重复最后一张图形15帧(数值都为0),15张图片 if (index == len(coordinates_lists) - 1): for i in range(15): filenames.append(filename) # 保存 plt.savefig(filename) plt.close()# 生成gifwith imageio.get_writer('mygif.gif', mode='I') as writer: for filename in filenames: image = imageio.imread(filename) writer.append_data(image)# 删除20张柱状图for filename in set(filenames): os.remove(filename)
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 音视频算法在淘宝中的应用
- 李隆基之子谁当皇帝,李隆基的哪个儿子继位了
- 卫子夫是谁的皇后,卫子夫做了多少年皇后
- 戴什么耳机损伤最小?耳机科学使用指南来了
- 快手小店微信小商店等电商平台如何使用菜鸟打印电子面单
- 氟轻松软膏的作用与功效,醋酸氟轻松软膏的功效作用有哪些
- 5G工业路由器在工业物联网场景的通信应用
- 肝不好喝菊花枸杞茶有用吗,黄芪菊花枸杞茶的功效
- 菊花茶喝多了会怎么样,藏红花泡水放多了会怎么样
- 可以祛痘的茶,喝茶可以排毒祛痘