700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 如何在终端界面借助图形化工具进行数据分析

如何在终端界面借助图形化工具进行数据分析

时间:2021-11-28 23:23:31

相关推荐

如何在终端界面借助图形化工具进行数据分析

如何在终端界面借助图形化工具进行数据分析

一、概述

本文主要介绍,在Linux终端界面,如何借助交互式绘图工具gnuplot,对数据进行分析,并以图表的方式进行展示,具体效果如下图所示:

Interrupt Data 643500 +-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | + + + + + + | | arch_timer . | | . | 643000 |-+ .+-| |. | |. .| | . | 642500 |-+. +-| | .| | | 642000 |-+ . +-| | . | | . | | . | 641500 |-+ . .+-| | | | . | |.| 641000 |-+ . +-| | .| | | | + . + + + + + | 640500 +-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 02:18:3502:18:4002:18:4502:18:5002:18:5502:19:0002:19:0502:19:10Time

二、背景

介绍前因

在日常的linux开发与测试过程中,有时会面临数据分析与采集的工作。以六轴的数据采集为例:为保证视频防抖的精确性,要求六轴数据的采集,必须达到一定的频率。为确保采集频率与预设值一致,除了在代码中进行统计外,一种常用的方式是通过读取/proc/interrupts节点,以获取相应的中断数:

[root@Ambarella /home/bin]#cat /proc/interrupts | grep -r 'gyro' -B 349:0000GIC-0 148 Edgevin2_idsp_last_pixel50:0000GIC-0 121 Edgevout_lcd51:0000GIC-0 120 Edgevout_tv52:88418000GPIO 30 Edgegyro

如上所示,通过该节点,我们能够获取中断号号,中断总个数,中断名称等信息。借此方式,我们可以对采集频率进行粗略的分析,但若想通过其获得准确的频率,则还是要经过一番运算。

正是考虑到以上以上的应用场景,就思考是否有方式能够将以上数据以图表的方式进行展现?具体的要求如下:

开放源码,支持跨平台能够在终端界面,以图表的方式展现数据,具有较强的可读性周期性的更新数据具有一定的通用性,经过简单修改可以适用于其它的应用场景

在明晰了具体的需求后,接下来需要确定具体的实现方案,具体的工作流如下:

网上搜索是否有现成的开源库,支持在终端绘图?初步检索,发现当前的开源库都需要图形界面支持?转换思路。当前看到一些界面,如升级进度条,linux的系统资源监视工具htop的界面是如何实现(如下图)?

图1:htop展示界面

以上图示中,仅也只能够通过进度条,进行直观显示,可以满足部分需求,但仍不是最优解。

继续搜索相关资料,发现gnuplot可以在终端界面绘图。现行在虚拟机上验证可行性。了解基本使用后,移植到设备上。

以上,为确定最终方案的大体的过程。

三、实现流程

经过前期的了解,确定了以下的技术方案: ``` shell script + gnuplot ``` 其中shell脚本负责数据的采集,gnuplot则负责最终的展示工作。最终的效果如下图所示:

gyro sample frequency 580 +----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | + ++ + + + + ++ + | |A gyro ***A*** | 570 |-+ * +-| |*| |** | | * * | 560 |-+ * * +-| | * * | | * * | 550 |-+ * * +-| | A* * | | * * * | 540 |-+* * * * +-| | * * * * A A | | A * * A* * ** * | 530 |-+ * * * ** * * * ** * +-| | * *A * ** * * * A**A * ** *| | * * * * * ** * A**** * A * * ** * * | | * * * * *A * * * * * *A**A** ** * * ** * *A | 520 |-+* * * A* * * * * **A** * A A * * A***A***A**A * A**** ** *-| | ** *A** * *** *AA*****A**A* AA*A* *** A**A**AA**A *| | A + A* A+A**A***A**AA* + A**A**+ + + A* ++ A + | 510 +----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 00:05:55 00:06:00 00:06:05 00:06:10 00:06:15 00:06:20 00:06:25 00:06:30 00:06:35 00:06:40 00:06:45 00:06:50Time(hh:mm:ss)

图中横轴标志时间(hh:mm:ss),纵轴标志频率(Hz),其中字符A标志着各个数据采集点。从中不难发现,采集频率基本稳定在510Hz左右。

:这与配置的500Hz,存在一定误差,关于引起误差的原因,会在后边详述。

接下来,我们会详解具体的实现流程。

1. gnuplot介绍

gnuplot是一套跨平台的数学绘图自由软件。使用命令列界面,可以绘制数学函数图形,也可以从纯文字档读入简单格式的座标资料,绘制统计图表等等。它可以提供多种输出格式,例如PNG,SVG,PS,HPGL,供文书处理、简报、试算表使用。它并不是统计软件或数学软件。 –gnuplot维基简介

gnuplot作为跨平台软件,同时支持windows,以及linux。本文基于Linux平台,因此采用源码进行编译。源码获取地址:gnuplot源码;

由于其采用了Autoconf配置脚本。编译方式与其它使用GNU构建系统的开源软件并无二异,具体指南详见代码仓库根目录下的说明文档INSTALL

:一个相对规范的开源项目,都会有相应的文档(README,或者INSTALL)用来介绍项目的基本内容以及安装方法。授人以鱼不如授人以渔。在面对其他开源库,或第三方工具时,也建议先阅读相关文档。由此及彼,个人在提供开源库,或发布公共API时,也应提供必要的文档,以方便后来人。

成功编译后,即可获得相应的可执行文件gbuplot;

2. 通过一个简单的示例,介绍其使用流程

本节将通过一个简单的示例——采集并分析六轴的采样频率,来介绍该方案的使用流程。

该示例最终实现的效果是:

每秒获取最新的数据,计算差值,获得频率设置横轴显示时间,纵轴显示频率每秒获取数据文件中最新的50条数据,清空窗口后,刷新显示界面

1)获取有效数据

此一步,需要我们借助shell脚本获取中断数据,经过简单的处理后,保存至数据文件中。

#!/bin/bashrm plot.dati=0;last_cnts=0;cur_cnts=0;while [ 1 ]do let i=i+1;#获取当前中断数量cur_cnts=`cat /proc/interrupts | grep -rin 'gyro' | awk '{print $3}'`#第一次执行时,last_cnts为0,无需统计差值if [ $last_cnts -eq 0 ];thenlast_cnts=$cur_cnts;continue;fi#获取差值,并按照"时间\t差值"的各执写入数据文件 plot.datecho -e `date "+%H:%M:%S"`"\t"`expr ${cur_cnts} - ${last_cnts}` >> plot.dat;last_cnts=$cur_cnts;#清除整个串口,以保证图表显示在窗口前端echo -e "\033c"#执行gnuplot 具体的配置就在 liveplot.gnugnuplot liveplot.gnu#由于绘图操作需要消耗时间,因此1秒的延时并不准确,这才造成了统计的频率比设置的频率要高sleep 1done

该脚本的流程相对简单,流程如下:

2)gnuplot设置

gnuplot作为命令行工具,除了可以采用交互模式运行外,也可以通过读取文件的当时执行。在第一步gnuplot liveplot.gnu,相关的配置就记录在liveplot.gnu文件中,具体内容如下:

#设置终端样式set terminal dumb size 180,30#设置时间格式set xdata timeset timefmt "%H:%M:%S"set format x "%H:%M:%S"set title "gyro sample frequency"# x轴名称set xlabel 'Time(hh:mm:ss)'# y轴名称set ylabel 'frequency(Hz)'#设置自动缩放(x轴与y轴)set autoscale# 以 plot.dat 的最后50条数据作为数据源,进行绘制;using 1:2意为,采用第1列作为x轴数据来源,采用第2列作为y轴数据源;with linespoints表示采用点线的方式形式绘制数据plot "<(tail -n 50 plot.dat)" using 1:2 with linespoints title 'gyro'#设置刷新周期为1秒#pause 1#重新读取文件#reread

关于gnuplot的使用教程,出了可以借助内置的help方式获取外,以下的几篇博客,亦有助于理解使用方法:

gnuplot画图点线设置gnuplot 学习小计2-时间、文件、数据选择、平滑gnuplot 画文本特定行的数据gnuplot 入门教程 4

通过以上两步骤,就可以绘制出上文展示的图像。

四、文档信息

作者: Litost_Cheng

发表日期:11月10日

更多内容:

Litost_Cheng的个人博客Litost_Cheng的GithubLitost_Cheng的博客

五、参考与链接

gnuplot:http://www.gnuplot.info/htop:https://htop.dev/gnuplot维基简介:/wiki/Gnuplotgnuplot源码:/p/gnuplot/gnuplot-main/ci/master/tree/Autoconf:/wiki/Autoconfgnuplot画图点线设置:/u012836354/article/details/78908436gnuplot 学习小计2-时间、文件、数据选择、平滑:/yanxiangtianji/article/details/8806802gnuplot 画文本特定行的数据:/qq_24484485/article/details/80967765gnuplot 入门教程 4:/liyuanbhu/article/details/8502461

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。