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

有数值的条形图图片是5张,没数值的图片是2+15=17张 。

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

文章插图
 
GIF结束段,添加了15帧空白图片 。所以在结束的时候会显示一段时间的空白 。
可以设置一下条形图当前位置到下个位置的速度,让过渡变得平滑 。
将当前位置和下一个位置之间的距离除以过渡帧数 。
n_frames = 10x = [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]]print('生成图表n')filenames = []for index in np.arange(0, len(coordinates_lists) - 1):    # 获取当前图像及下一图像的y轴坐标值    y = coordinates_lists[index]    y1 = coordinates_lists[index + 1]    # 计算当前图像与下一图像y轴坐标差值    y_path = np.array(y1) - np.array(y)    for i in np.arange(0, n_frames + 1):        # 分配每帧的y轴移动距离        # 逐帧增加y轴的坐标值        y_temp = (y + (y_path / n_frames) * i)        # 绘制条形图        plt.bar(x, y_temp)        plt.ylim(0, 80)        # 保存每一帧的图像        filename = f'images/frame_{index}_{i}.png'        filenames.append(filename)        # 最后一帧重复,画面停留一会        if (i == n_frames):            for i in range(5):                filenames.append(filename)        # 保存图片        plt.savefig(filename)        plt.close()print('保存图表n')# 生成GIFprint('生成GIFn')with imageio.get_writer('mybars.gif', mode='I') as writer:    for filename in filenames:        image = imageio.imread(filename)        writer.append_data(image)print('保存GIFn')print('删除图片n')# 删除图片for filename in set(filenames):    os.remove(filename)print('完成')看起来是平滑了许多 。
太强了,用Python制作动态可视化图表

文章插图
 
好了,接下来我们更改一下图表相关的配置参数,让图表变得好看 。
n_frames = 10bg_color = '#95A4AD'bar_color = '#283F4E'gif_name = 'bars'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]]print('生成图表n')filenames = []for index in np.arange(0, len(coordinates_lists) - 1):    y = coordinates_lists[index]    y1 = coordinates_lists[index + 1]    y_path = np.array(y1) - np.array(y)    for i in np.arange(0, n_frames + 1):        y_temp = (y + (y_path / n_frames) * i)        # 绘制条形图        fig, ax = plt.subplots(figsize=(8, 4))        ax.set_facecolor(bg_color)        plt.bar(x, y_temp, width=0.4, color=bar_color)        plt.ylim(0, 80)        # 移除图表的上边框和右边框        ax.spines['right'].set_visible(False)        ax.spines['top'].set_visible(False)        # 设置虚线网格线        ax.set_axisbelow(True)        ax.yaxis.grid(color='gray', linestyle='dashed', alpha=0.7)        # 保存每一帧的图像        filename = f'images/frame_{index}_{i}.png'        filenames.append(filename)        # 最后一帧重复,画面停留一会        if (i == n_frames):            for i in range(5):                filenames.append(filename)        # 保存图片        plt.savefig(filename, dpi=96, facecolor=bg_color)        plt.close()print('保存图表n')# 生成GIFprint('生成GIFn')with imageio.get_writer(f'{gif_name}.gif', mode='I') as writer:    for filename in filenames:        image = imageio.imread(filename)        writer.append_data(image)print('保存GIFn')print('删除图片n')# 删除图片for filename in set(filenames):    os.remove(filename)print('完成')


推荐阅读