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

本文介绍如何在Linux终端使用gnuplot进行数据分析及展示。通过shell脚本采集数据,gnuplot实现实时图表绘制,用于监测六轴传感器的采样频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

一、概述

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

                                                                                        Interrupt Data                                                                               
     643500 +-------------------------------------------------------------------------------------------------------------------------------------------------------------------+   
            |                      +                       +                      +                       +                      +                       +                      |   
            |                                                                                                                                                arch_timer    .    |   
            |                                                                                                                                                .                  |   
     643000 |-+                                                                                                                                     .                         +-|   
            |                                                                                                                                  .                                |   
            |                                                                                                                    .         .                                    |   
            |                                                                                                               .                                                   |   
     642500 |-+                                                                                                    .                                                          +-|   
            |                                                                                                 .                                                                 |   
            |                                                                                                                                                                   |   
     642000 |-+                                                                                           .                                                                   +-|   
            |                                                                                   .                                                                               |   
            |                                                                               .                                                                                   |   
            |                                                                     .                                                                                             |   
     641500 |-+                                                          .    .                                                                                               +-|   
            |                                                                                                                                                                   |   
            |                                                   .                                                                                                               |   
            |                                              .                                                                                                                    |   
     641000 |-+                                       .                                                                                                                       +-|   
            |                                .                                                                                                                                  |   
            |                                                                                                                                                                   |   
            |                      +    .                  +                      +                       +                      +                       +                      |   
     640500 +-------------------------------------------------------------------------------------------------------------------------------------------------------------------+   
        02:18:35               02:18:40                02:18:45               02:18:50                02:18:55               02:19:00                02:19:05               02:19:10
                                                                                            Time                                                                                   

二、背景

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

[root@Ambarella /home/bin]#cat /proc/interrupts | grep -r 'gyro' -B 3
 49:          0          0          0          0     GIC-0 148 Edge      vin2_idsp_last_pixel
 50:          0          0          0          0     GIC-0 121 Edge      vout_lcd
 51:          0          0          0          0     GIC-0 120 Edge      vout_tv
 52:      88418          0          0          0      GPIO  30 Edge      gyro

  如上所示,通过该节点,我们能够获取中断号号,中断总个数,中断名称等信息。借此方式,我们可以对采集频率进行粗略的分析,但若想通过其获得准确的频率,则还是要经过一番运算。
  正是考虑到以上以上的应用场景,就思考是否有方式能够将以上数据以图表的方式进行展现?具体的要求如下:

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

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

  • 网上搜索是否有现成的开源库,支持在终端绘图?初步检索,发现当前的开源库都需要图形界面支持?
  • 转换思路。当前看到一些界面,如升级进度条,linux的系统资源监视工具htop的界面是如何实现(如下图)?
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** *         *          *     * *A     A**      ***A**A*    A                          A          *A*                 ***   A**A**A     A**A    *|   
         |           A  +  A*    A     +     A**A***A**A     A*       +  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:50
                                                                                     Time(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/bash
rm plot.dat
i=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 ];then
		last_cnts=$cur_cnts;
		continue;
	fi
#获取差值,并按照"时间\t差值"的各执写入数据文件 plot.dat
	echo -e `date "+%H:%M:%S"`"\t"`expr ${cur_cnts} - ${last_cnts}` >> plot.dat;
	last_cnts=$cur_cnts;
#清除整个串口,以保证图表显示在窗口前端
	echo -e  "\033c"
#执行gnuplot 具体的配置就在 liveplot.gnu
	gnuplot  liveplot.gnu
#由于绘图操作需要消耗时间,因此1秒的延时并不准确,这才造成了统计的频率比设置的频率要高
	sleep 1
done

  该脚本的流程相对简单,流程如下:
在这里插入图片描述

2)gnuplot设置

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

#设置终端样式
set terminal dumb size 180,30
#设置时间格式
set xdata time
set 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方式获取外,以下的几篇博客,亦有助于理解使用方法:

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

四、文档信息

作者: Litost_Cheng

发表日期:2020年11月10日
更多内容:

  1. Litost_Cheng的个人博客
  2. Litost_Cheng的Github
  3. Litost_Cheng的博客
  1. gnuplot:http://www.gnuplot.info/
  2. htop:https://htop.dev/
  3. gnuplot维基简介:https://zh.wikipedia.org/wiki/Gnuplot
  4. gnuplot源码:https://sourceforge.net/p/gnuplot/gnuplot-main/ci/master/tree/
  5. Autoconf:https://zh.wikipedia.org/wiki/Autoconf
  6. gnuplot画图点线设置:https://blog.youkuaiyun.com/u012836354/article/details/78908436
  7. gnuplot 学习小计2-时间、文件、数据选择、平滑:https://blog.youkuaiyun.com/yanxiangtianji/article/details/8806802
  8. gnuplot 画文本特定行的数据:https://blog.youkuaiyun.com/qq_24484485/article/details/80967765
  9. gnuplot 入门教程 4:https://blog.youkuaiyun.com/liyuanbhu/article/details/8502461
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值