zoukankan      html  css  js  c++  java
  • Python 画个图

    先放上最后的结果图(数据画的有点丑,随便看看就好了):

    功能描述:

    这个脚本主要的作用就是监视指定文件夹中(示例中在脚本所在文件夹下)指定文件这里就是csv文件中的数据做折线图;再将这一系列的图保存成一个gif动图。

    数据展示:

    注:由于在写脚本的时候没法在文件夹中自动生成相关文件,所以就自己手动编了4个test.csv格式的数据,数据结构如上图所示。图中的数据虽然有三行,但是用pandas导入进python后第一行将会被默认为数据框的列名;所以后面取出来能用的数据就只有两行而已,就是两个点,在上面的动图中就只有前面几帧是这个数据贡献的

     

    脚本源码:

     生成 png 文件脚本:

     1 #!/usr/bin/python3
     2 # -*- coding: utf-8 -*-
     3 import pandas as pd
     4 import matplotlib.pyplot as plt
     5 import os
     6 import time
     7 
     8 # 这个函数是用来画图的,循环的画图,这样显示的时候就是连续的动图状态
     9 def plot(x1,y1,jj):
    10     xx = []
    11     yy = []
    12     for t in range(len(x1)):
    13         xx.append(x1[t]) # 取一个新的 x 值加入到 x 坐标数组中
    14         yy.append(y1[t]) # 取一个新的 y 值加入到 y 坐标数组中
    15         ax.plot(xx, yy, c = 'b', marker='.', ms = 9) # 画图
    16         plt.pause(1) # 暂停一秒
    17         name =  jj + "_" + str(t) + ".png"
    18         plt.savefig(name) # 保存为 png 格式的图片文件
    19 
    20 # 下面这些参数主要是对图等一系列参数进行规范化,这边可以使得后面的
    21 # 单个图除内容外边框大小等参数都是一样的
    22 plt.close()
    23 fig=plt.figure()
    24 ax=fig.add_subplot(1,1,1)
    25 ax.axis("equal")
    26 plt.grid(True)
    27 plt.ion()
    28 
    29 # 获得x, y数值用来画图部分
    30 list_f = [] # 用来保存文件夹下已有的 csv 文件名
    31 x_0 = [0] # 图上原点的 x 坐标
    32 y_0 = [0] # 图上原点的 y 坐标
    33 
    34 while True:
    35 
    36     list_temp = []
    37     list_new = []
    38     time.sleep(1) # 正式使用时需改成适当的间隔时间
    39 
    40     files = os.popen("ls").read() # 获取 csv 文件名
    41     for i in files.splitlines():
    42         if os.path.splitext(i)[1] == ".csv":
    43             list_temp.append(i)
    44             
    45     # 两个数组求差集,获得更新的文件名
    46     list_new = list(set(list_temp) ^ set(list_f)) 
    47     if list_new:
    48         list_f = list_f + list_new
    49         #print(list_new)
    50         for j in list_new:
    51             x = []
    52             y = []
    53             data = pd.read_csv(j).T # 读入新的 csv 文件
    54             x = list(data.iloc[0].values) # 取 X 值
    55             y = list(data.iloc[1].values) # 取 Y 值
    56             x.insert(0,x_0[0]) # 加上原点坐标
    57             y.insert(0,y_0[0]) # 同上
    58             #print(x)
    59             #print(y)
    60             plot(x,y,j) # 画图
    61             x_0[0] = x[-1] # 更新 X 中的初始坐标
    62             y_0[0] = y[-1] # 更新 Y 中的初始坐标
    63             #print("X0=",x_0,"; Y0=",y_0)

    这个脚本中还有一部分是在写的时候没有考虑到的内容,在真实情况下一个生成的 csv 文件很可能其中的数据内容还在一直的更新,所以建议可将脚本中的相关部分改成,当大于两个 csv 文件时才开始画第一个 csv 中的数据(这种方法是针对所运行的程序将依次产生多个 csv 数据文件时),或者读取 csv 文件中的数据行数,在达到一定行数后,便开始画图(此部分需要将上面的脚本进行较大的改动)。

    生成 GIF 文件代码:

     1 # -*- coding:utf-8 -*-
     2 import imageio, os
     3 
     4 def gif(path):
     5 
     6     cmd = "ls " + path
     7     files = os.popen(cmd).read()
     8     list_temp = []
     9 
    10     for i in files.splitlines():
    11         if os.path.splitext(i)[1] == ".png":
    12             list_temp.append(i)
    13     list_temp.sort(key = lambda fi:os.path.getmtime(path + fi))
    14 
    15     '''
    16     上述代码部分主要是得到一个名为list_temp的数组,储存该文件夹下所有
    17     png文件的文件名    
    18     '''
    19 
    20     # imageio 模块生成 gif 文件 
    21     images = []
    22     for file_n in list_temp:
    23         images.append(imageio.imread(file_n))
    24         imageio.mimsave('test.gif', images, duration=1)
    25 
    26 # 运行上面的函数
    27 if __name__ == '__main__':
    28     pathway = "/Users/xxxxx/" # 文件夹地址
    29     gif(pathway) 
    30 
    31     # 后面两句注释的语句属于可选部分,作用就是
    32     # 在生成 gif 文件后将原始 png 文件全部删除
    33     #rm = "rm " + pathway + "*.png"
    34     #os.system(rm)

    上述两个脚本代码可以写在同一个文本中,只需要在监视画图的脚本中加入终止跳出机制即可。

    上面两个脚本中可能还存在很多错误,欢迎指证。

    未经许可,严禁转载 !!!

  • 相关阅读:
    DataGridView使用SqlCommandBuilder批量更新数据
    【转】Python中中文处理的问题
    Logging模块的简单使用 Python
    Python 3 collections.defaultdict() 与 dict的使用和区别
    [转]关于Python的super用法研究
    Python 关于 name main的使用
    ClickOnce 我的大爱
    DataGridView控件显示行号的正确代码
    SQL存储过程和事务处理
    指针赋值的问题【转】
  • 原文地址:https://www.cnblogs.com/zijunlearningclanguage/p/9572320.html
Copyright © 2011-2022 走看看