Python 学习之 4 —— 基于images2gif 的动态示意图
简介
Python画图的包实在是太多了,常见的有:matplotlib,Pillow。
这里介绍一下不常见的画动态图的库:images2gif 。
1. images2gif 配置
为什么说images2gif是不常见的库呢?
是因为,在我安装images2gif并出错后,想上网搜一下,报错的原因,但是并没有找到有人问关于images2gif的问题。
这是其一,其二是因为,这个库最新的版本才是2013年更新的,python升级后,不知道还能不能适用。
其三,在我安装了image2gif后才发现,实际上这个库非常的简单,只有一个.py文件,如下所示。
所以,实际上这个库可以看做是一个别人封装好的函数,当我们想用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.****.net/lovetaozibaby/article/details/88671377 ),生成的动图如下所示。
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之外,还有一些也可以做动图生成和分析。
- https://blog.****.net/monotonomo/article/details/80586194#t0 (images2gif, imageio )
- https://blog.****.net/guduruyu/article/details/77540445 (PIL)
- https://blog.****.net/qq_28888837/article/details/85778395 (matplotlib)