简单实用的python动态可视化,非animation – Python量化投资

简单实用的python动态可视化,非animation

简单实用的python动态可视化,非animation

语言&工具:python-matplotlib

以前在实现这个的时候,找了很多很多的文章,方法,都不能符合我实现动态可视化的需求

很多文章,要么不是动态,要么代码根本就调不通,要么就是些教程。下面的代码的数据源

是实时动态的,结果显示是动态折线图。

代码:

#!/usr/bin/env python2

# coding=utf-8

import matplotlib.pyplotas plt

import time

”’

data2image函数,从订阅器生成的文件中实时提取数据生matplotlib动态曲线图

”’

def image(list1,line1):

    speed= map(float,line1[0].split())

    time.sleep(0.1)

    #  把数据放入list

    list1.extend(speed)

    #  设置子图1

    ax1= plt.subplot(3,1,1)

    plt.cla()

    #  设置网格线-子标题-x-y轴的颜色; 类型; 粗细

    ax1.grid(color=’purple’,linestyle=’–‘,linewidth=1,alpha=0.3)

    ax1.set_title(‘Speed Curve’,fontsize=20,color=’pink’)

    ax1.set_xlabel(‘time’,fontsize=15,color=’deepskyblue’)

    ax1.set_ylabel(‘speedValue’,fontsize=15,color=’g’)

    #  如果列表长度大于30,擦除前面的数据,只显示最新的30个

    if len(list1)>= 100:

        ax1.plot(range(100),list1[-100:],color=’r’,markerfacecolor=’r’,marker=’o’,markersize=1)

         # ax1.plot(range(30), yy[-30:], color=’orange’, markerfacecolor=’r’, marker=’o’, markersize=2)  # 有需要可以一图多曲线

    else:  # 否则显示当前的数据

        ax1.plot(range(len(list1)),list1,color=’r’,markerfacecolor=’r’,marker=’o’)

        # ax1.plot(range(len(yy)), yy, color=’orange’, markerfacecolor=’r’, marker=’o’)

    #  设置子图或标题间的间距

    #plt.tight_layout(pad=5.0, w_pad=5.0, h_pad=3.0)

    plt.pause(0.01)

def data2image(Speed):

    #  订阅器中生成的存储计算数据的文件

    speed_data= open(Speed)

    #  定义一个空列表

    list1= []

    #  设置图像的大小,图像曲线的粗细度

    plt.rcParams[‘figure.figsize’]= (12,15)

    plt.rcParams[‘lines.linewidth’]= 1.5

    #  设置总图像的大标题文字,标题内容,字体颜色

    plt.suptitle(‘Real Time Image’,fontsize=20,color=’teal’)

    while 1:

        line1= speed_data.readlines()

        #  读取dat文件内容,读取出来是[‘字符串’]的形式

        if not line1:  # 如果没有数据,等待6秒,6秒内回复产出数据,再次画图,否则down

            print ‘no data output,wait for 6secs’

            time.sleep(6)

            if line1:

                image(list1, line1)

            else:  # 如果长时间没有数据,判断为程序停止,输出最终的计算结果

                plt.close()

                break

        else:  # 有数据,处理数据并实时画图

            image(list1, line1)

if __name__== ‘__main__’:

    # 这里的文件是从订阅器接收数据,订阅器是个loop所以不能直接可视化,中间转储到.dat文件,再从.dat文件实时读取

    Speed= ‘~/opt/data/speed.dat’ 

    data2image(Speed)

#Tips:本人的环境是ROS开发平台,所以自带的是python2,有需要可以换成3

这段代码方法是这样的,具体放自己环境调整下就能用,强调一下:这个必须是实时数据

如果觉得对大家有帮助,我很开心!如果大神们有更好的方法,也请不吝赐教

https://www.jianshu.com/p/78c599910f1d

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论