Python 学习之 4 —— 基于images2gif 的动态示意图

简介

Python画图的包实在是太多了,常见的有:matplotlibPillow

这里介绍一下不常见的画动态图的库:images2gif

1. images2gif 配置

为什么说images2gif是不常见的库呢?

是因为,在我安装images2gif并出错后,想上网搜一下,报错的原因,但是并没有找到有人问关于images2gif的问题。

这是其一,其二是因为,这个库最新的版本才是2013年更新的,python升级后,不知道还能不能适用。

Python 学习之 4 —— 基于images2gif 的动态示意图

其三,在我安装了image2gif后才发现,实际上这个库非常的简单,只有一个.py文件,如下所示。
Python 学习之 4 —— 基于images2gif 的动态示意图
所以,实际上这个库可以看做是一个别人封装好的函数,当我们想用images2gif画动图时,只需要将 该链接下的images2gif.py文件copy到当前工作目录下即可:https://github.com/isaacgerg/images2gif

2. 实例程序

这里 找到了一段利用images2gif生成动态度的示意程序,并做了一下修改,将其变成一个子函数,如下所示:

def gif_gene():
    outfilename = "./Path_diagram.gif"  # 转化的GIF图片名称
    filenames = []  # 存储所需要读取的图片名称
    for i in range(4):  # 读取100张图片
        figure_name = 'trace' + str(i) + '.jpg'
        filename =  './' + figure_name  # path是图片所在文件,最后filename的名字必须是存在的图片
        filenames.append(filename)  # 将使用的读取图片汇总
    frames = []
    for image_name in filenames:  # 索引各自目录
        im = Image.open(image_name)  # 将图片打开,本文图片读取的结果是RGBA格式,如果直接读取的RGB则不需要下面那一步
        im = im.convert("RGB")  # 通过convert将RGBA格式转化为RGB格式,以便后续处理
        im = np.array(im)  # im还不是数组格式,通过此方法将im转化为数组
        frames.append(im)  # 批量化
    writeGif(outfilename, frames, duration=0.5, subRectangles=False)  # 生成GIF,其中durantion是延迟,这里是1ms

调用时,只需要在图片所在目录下使用语句:gif_gene()即可。

将该子函数嵌套在路径示意图中(路径示意图的生成程序见:https://blog.csdn.net/lovetaozibaby/article/details/88671377 ),生成的动图如下所示。
Python 学习之 4 —— 基于images2gif 的动态示意图

3. 完整程序

# coding=utf-8

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
from images2gif import writeGif


def DrawPointMap():

    plt.figure()
    x0 = 5
    y0 = 5
    x = np.random.rand(30) * 10
    y = np.random.rand(30) * 10



    plt.scatter(x, y, color = 'k', marker = 'o'      # 要标记的点的坐标、大小及颜色
                ,label = 'Location')

    # annotate an important value
    plt.scatter(x0, y0, s = 200, color = 'r',
                marker='*',label = 'Center')          # 要标记的点的坐标、大小及颜色
    plt.legend()                                      # 图例


    plt.savefig('trace0.jpg', dpi=100,
                bbox_inches='tight')  # 文件命名为Nanjing.png存储
    route1(x0, y0, x, y, plt, 0, 10, 'orange')
    plt.savefig('trace1.jpg', dpi=100,
                bbox_inches='tight')  # 文件命名为Nanjing.png存储
    route1(x0, y0, x, y, plt, 10, 20, 'darksage')
    plt.savefig('trace2.jpg', dpi=100,
                bbox_inches='tight')  # 文件命名为Nanjing.png存储
    route1(x0, y0, x, y, plt, 20, 30, 'deepskyblue')
    plt.savefig('trace3.jpg', dpi=100,
                bbox_inches='tight')  # 文件命名为Nanjing.png存储

    gif_gene()


# plt.show()
def gif_gene():
    outfilename = "./Path_diagram.gif"  # 转化的GIF图片名称
    filenames = []  # 存储所需要读取的图片名称
    for i in range(4):  # 读取100张图片
        figure_name = 'trace' + str(i) + '.jpg'
        filename =  'E:/my/Process_recent/python/orbital_optimal/map/' + figure_name  # path是图片所在文件,最后filename的名字必须是存在的图片
        filenames.append(filename)  # 将使用的读取图片汇总
    frames = []
    for image_name in filenames:  # 索引各自目录
        im = Image.open(image_name)  # 将图片打开,本文图片读取的结果是RGBA格式,如果直接读取的RGB则不需要下面那一步
        im = im.convert("RGB")  # 通过convert将RGBA格式转化为RGB格式,以便后续处理
        im = np.array(im)  # im还不是数组格式,通过此方法将im转化为数组
        frames.append(im)  # 批量化
    writeGif(outfilename, frames, duration=0.5, subRectangles=False)  # 生成GIF,其中durantion是延迟,这里是1ms

# 配送路线

def route1(x0, y0, x, y, plt, N_begin, N_end,color):
    for i in range(N_begin, N_end):
        if i == N_begin:
            x_begin,y_begin = x0, y0
            x_end, y_end = x[i], y[i]
            plt_arrow(x_begin, y_begin, x_end, y_end, color)

        if i < N_end - 1:
            x_begin, y_begin = x[i], y[i]
            x_end, y_end = x[i+1], y[i+1]

        if i == N_end - 1:
            x_begin, y_begin = x[i], y[i]
            x_end, y_end = x0, y0

        plt_arrow(x_begin, y_begin, x_end, y_end, color)


def plt_arrow(x_begin,y_begin,x_end,y_end,color):

    plt.arrow(x_begin, y_begin, x_end - x_begin, y_end - y_begin,
             length_includes_head=True,     # 增加的长度包含箭头部分
             head_width = 0.3, head_length =0.5, fc=color, ec=color)

if __name__=='__main__':

    DrawPointMap()

最后,分享几个介绍python动图生成的网页,除了images2gif之外,还有一些也可以做动图生成和分析。

  1. https://blog.csdn.net/monotonomo/article/details/80586194#t0 (images2gif, imageio )
  2. https://blog.csdn.net/guduruyu/article/details/77540445 (PIL)
  3. https://blog.csdn.net/qq_28888837/article/details/85778395 (matplotlib)