太强了,用Python制作动态可视化图表

通常大家做出来的图表,绝大部分都是静态的,有时会显得不够吸引人 。
今天小F就给大家介绍一下,如何用Python绘制动态图表 。
主要是使用到Matplotlib+imageio,其中Matplotlib就有一个Animation类,可以生成动图GIF,不过使用起来学习成本较高,还是有一定难度的 。

太强了,用Python制作动态可视化图表

文章插图
【太强了,用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之间的随机整数列表,结果如下 。
太强了,用Python制作动态可视化图表

文章插图
 
下面将对整数列表进行切片,生成不同阶段的图表 。
# 第一张图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四个折线图表 。
太强了,用Python制作动态可视化图表

文章插图
 
有了这四张图,我们就可以使用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)动图来了 。
太强了,用Python制作动态可视化图表

文章插图
 
一个会动的折线图表就制作出来了,不过不是从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 。
太强了,用Python制作动态可视化图表

文章插图
 
可以看到折线图的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)


推荐阅读