• 【转载】使用 gnuplot 在网页中显示数据


    来源:http://www.ibm.com/developerworks/cn/aix/library/au-gnuplot/

    简介

    gnuplot 是一个用于生成趋势图和其他图形的工具。它通常用于收集基于时间的数据,但是不限于此;也可以使用静态数据。gnuplot 可以以批模式运行或动态运行,结果由图形查看程序或 Web 浏览器显示。本文演示如何使用 gnuplot 和批文件为从 sar 或其他数据源收集的数据生成图形。gnuplot 有许多命令选项,可以通过 set 操作符使用它们。但是,要想使用线或框生成图形,需要对文档有所了解。

    在本文中,我将使用 Web 服务器提供图形。

    gnuplot 概述

    gnuplot 把原始表格数据转换为图形文件。流行的格式是 png、pdf 和 jpeg,然后可以把它们动态地或直接地传递给 X 终端、网页或通用的图形查看程序。还可以把图像导入文档。使用命令界面与 gnuplot 交互,使用 “set” 命令指定图像的格式和显示方式。这通常包括图像的大小、使用的颜色、刻度、x, y 坐标和输出图像名。然后,使用 plot 命令通过 gnuplot 引擎实际生成图像。还可以使用 splot 命令绘制 3D 图像。尽管可以使用命令界面以交互方式执行命令,但是最好的方法是使用配置文件,这样就可以通过 shell 'here' 文档方法使用文件中的变量(如果需要的话),从而重用配置文件。然后,通过管道把配置文件与 gnuplot 连接起来以生成图像文件。如果配置文件中有错误,在这个过程中会显示这些错误,并突出显示错误的位置。生成图像文件之后,就可以显示它们了。

    与用于生成图形的任何数据收集过程一样,在把数据传递给 gnuplot 之前,必须对收集的数据做一些筛选。这可能包括删除数据文件中头尾不需要的信息;sed 和 awk 有助于满足任何文本筛选需求。

    安装 gnuplot

    可以从 AIX® 5L Source Packages 网站下载 rpm 形式的 gnuplot 4.2:http://www.perzl.org/aix/index.php

    对于本文中的示例,除了 gnuplot,还需要一个正在运行的 http 服务器。

    也可以从本文后面或 AIX toolbox 网站下载所需的依赖库和 http 服务器。

    在安装 gnuplot 之前,一定要安装下面的 rpm 库,因为 gnuplot 需要这些库:

    fontconfig-2.7.2-1.aix5.1.ppc.rpm
    expat-2.0.1-2.aix5.1.ppc.rpm 
    freetype2-2.3.9-1.aix5.1.ppc.rpm
    zlib-1.2.3-5.aix5.1.ppc.rpm 
    libpng-1.2.40-1.aix5.1.ppc.rpm
    gd-2.0.35-4.aix5.1.ppc.rpm
    libjpeg-7-1.aix5.1.ppc.rpm
    libXpm-3.5.7-2.aix5.1.ppc.rpm 
     gettext-0.17-1.aix5.1.ppc.rpm
    glib2-2.20.5-1.aix5.1.ppc.rpm

    使用以下命令列出已经安装的 rpm:

    # rpm –qa

    最后,安装 gnuplot 包:

    # rpm -ivh gnuplot-4.2.4-1.aix5.1.ppc.rpm

    运行 gnuplot 以测试它。这会显示 gnuplot 命令界面(用 quit 命令退出界面):

    $ gnuplot
          G N U P L O T
            Version 4.2 patchlevel 4
            last modified Sep 2008
            System: 5.3
            Copyright (C) 1986 - 1993, 1998, 2004, 2007, 2008
            Thomas Williams, Colin Kelley and many others
            Type `help` to access the on-line reference manual.
            The gnuplot FAQ is available from http://www.gnuplot.info/faq/
            Send bug reports and suggestions to <http://sourceforge.net/projects/gnu
    plot>
    Terminal type set to 'unknown'
    gnuplot>

    用 sar 创建图形

    sar 可能是最常用的收集性能数据的方法,所以我们以它作为示例。清单 1(sarx.txt)是通过运行 sar 收集的数据,数据收集时间为 5 小时,每小时收集一次,输出已经经过筛选。

    清单 1. sarx.txt
    14:10:50        33  27    4     36      4.00
    15:10:50        29  14    3     28      4.00
    16:10:50        35  21    1     31      4.00
    17:10:49        38 29    2     39      4.00
    18:10:40        42  29    3     35      4.00

    接下来,创建一个文件以包含生成图形所需的所有 gnuplot 命令。可以给这个文件起任何名字;在本文中,我把它命名为 sarx.conf。

    为了能够生成图像,必须告诉 gnuplot 图形文件应该采用什么格式以及应该如何显示。清单 2(sarx.conf)包含执行 set 操作的配置文件。以 # 字符开头的行是注释。我们仔细看看 清单 2

    set terminal png truecolor

    首先设置终端类型,这告诉 gnuplot 生成的图像应该采用什么格式。本文使用 png (Portable Network Graphics) 格式。

    set output "sarimage.png"

    接下来,告诉 gnuplot 实际的输出图像文件名。在这里,文件名为 sarimage.png。

    set autoscale

    在生成图形时,需要指定数据的 x 和 y 轴范围。这个示例让 gnuplot 自己计算范围值。但是,可以修改这个选项(稍后演示)。

    set xdata time
    set timefmt "%H:%M:%S"

    因为这个示例使用日期值作为数据的参照点,需要告诉 gnuplot 日期数据的格式。在 清单 1 sarx.txt 中,日期格式为:

    Hour:Minute:Seconds

    根据 UNIX 日期表示法,日期变量应该放在双引号中。常用的其他格式包括:

    %d  - day of month 1 -31
    %m - month of year 1 -12
    %y  - year 0-99
    %b  - three character of month name , ie: jan ,feb
    %B  - name of month

    如果日期列采用 Hour-Minute 格式,就用 : set timefmt ″%H-%M″ 表示。

    set style data lines

    在显示这个图形时,绘制出的数据应该是一条平滑的数据线。常用的其他绘制格式包括:dots、boxes、errorbars、candlesticks。

    plot "sarx1.txt" using 1:2 title "%user", '' using 1:3 title "%sys"

    接 下来,使用 plot 命令实际绘制或生成图形。首先,指定数据输入文件名,然后告诉 gnuplot 要绘制哪些列。在这个示例中,使用第 1 列作为 x 轴,绘制第 2 列数据,标题为 “%user”;然后绘制第 3 列,标题为 “%sys”。标题(即标签)显示在图形的右上角。在绘制时,第 2 列和第 3 列使用第 1 列作为 x 值。plot 命令中的每个 ‘using’ 语句由逗号分隔。下一节讨论为什么要使用两个单引号。

    生成图像文件的命令格式为:

    cat < conf file> | gnuplot

    对于本文,我使用:

    $ cat sarx.conf | gnuplot

    现在会生成 sarimage.png 文件。为了查看这个图像,把这个文件复制到 Web 服务器文件系统中的 htdocs 目录中。

    图 1(sarimage)显示使用提供的示例数据在 Web 浏览器中看到的输出。

    清单 2. sarx.conf
    #sarx.conf
    set terminal png truecolor
    set output "sarimage.png"
    set autoscale
    set xdata time
    set timefmt "%H:%M:%S"
    set style data lines
    plot "sarx.txt" using 1:2 title "%user", '' using 1:3 title "%sys"
    图 1. sarimage

    图 1. sarimage

    绘图选项的表示

    在 plot 命令中可以使用缩写。例如,在最初的 plot 命令后面,其他 plot 命令选项都可以缩写,用选项的第一个字母表示。但是,对于本文,我只用缩写表示输入文件,即使用两个单引号表示输入文件 (sarx1.txt)。下面详细解释一下。第一个示例是本文中使用的表示法,第二个示例是缩写表示法,第三个示例是不使用任何缩写的完整命令语句。这三 个示例产生相同的输出。

    plot "sarx1.txt" using 1:2 title "%user", '' using 1:3 title "%sys"
    
    plot "sarx1.txt" using 1:2 title "%user", '' u 1:3 t "%sys"
    
    plot "sarx1.txt" using 1:2 title "%user",
    ″sarx1.txt'' using 1:3 title "%sys"

    在向其他用户显示图形时,有时候应该包含明确的标签和标题,以便用户了解数据的意义。为了包含 x 和 y 标签,应该使用 xlabel 和 ylabel 命令并把标签文本放在引号中:

    set ylabel " y line info here"
    set xlabel " x line info here"

    使用 title 命令添加图形的标题:

    set title "main title info here"

    在生成图形时,gnuplot 使用自己的默认颜色。在默认情况下,在白色背景上生成图形;这对于可能要打印的图形是有意义的。但是,可以使用颜色编码指定任何颜色,颜色编码以字母 x 开头,用十六进制表示。十六进制编码的格式为:

    xrrggbb

    在 Google 上搜索 ‘hex color codes’ 可以找到十六进制的颜色编码表。

    覆盖 gnuplot 默认颜色的次序为:

    background
    border 
    X
    Y
    plotting lines

    浅灰色的十六进制表示为:C9C9C9

    可以使用以下命令生成浅灰色背景的图形:

    set terminal png  xC9C9C9

    注意,在以上命令中必须替换终端类型 png 的 truecolor 选项,这会覆盖 gnuplot 使用的默认颜色。因为我没有指定其他颜色以覆盖默认设置,所以对于图形的其他颜色,gnuplot 仍然使用自己的默认颜色。

    在查看图形时,使用网格作为参照点也非常有用。下面的命令使用 grid 选项让 gnuplot 在图形上加上网格:

    set grid

    可以隐式地设置 x 和 y 坐标;但是,要确保指定的范围不小于数据的范围,否则无法绘制图形。对于 清单 1 中的示例数据,x 坐标(时间)的范围是从 14:10:50 到 18:10:40。

    y 坐标(第 2 列和第 3 列)的范围是从 14 到 50。

    可以根据这些信息指定自己的范围。下面的示例使用的 x 范围从 14:00 到 18:15,y 范围从 10 到 50。

    set xrange ["14:00:00" : "18:15:00"]
    set yrange ["10:00" : "50:00" ]

    清单 3 中使用这些修改,生成的图形输出见 图 2

    清单 3. sarx2.conf
    #sarx2.conf
    set terminal png  xC9C9C9
    set output "sarimage.png"
    set autoscale
    set xdata time
    set timefmt "%H:%M:%S"
    set ylabel "Performance"
    set xlabel "Time"
    set title "Sar Output Example"
    set xrange ["14:00:00":"18:15:00"]
    set yrange ["10:00" : "50:00" ]
    set grid
    set style data lines
    plot "sarx1.txt" using 1:2 title "%user", '' using 1:3 title "%sys"
    图 2. sarimage2

    图 2. sarimage2

    gnuplot 和柱状图

    还可以使用柱状图或框图表示数据,有时候这比使用静态数据更合适。清单 4 是从一台 AIX 机器获得的用户组用户总数。第 1 列包含 AIX 组名,第 2 列包含成员总数。

    清单 4. grpdata.txt
    staff   54
    apps    22
    sybgrp  12
    db2grp1 29
    dasdm   8
    dstage 21
    dsgrp  8
    batch  28
    db2prd 1

    要想使用柱状图,只需告诉 gnuplot 应该使用柱状图生成图形:

    set style data histograms

    默认生成的柱状图的框没有粗线边框,框中也没有填充颜色。但是,如果指定边框,在框的底边沿着 x 轴可能有两条粗线(这看起来不太美观)。

    gnuplot 按以下次序绘制框的边框:顶、底、左和右,值分别为 1、2、4、8。要想删除一条或多条边框线,只需提供相应值的和。在这个示例中,使用 -1 选项删除底部边框线。指定 fill 选项就会用默认颜色填充框:

    set style fill solid 1.00 border -1

    对 于 x 坐标,这里不使用时间,而是使用组名称。使用 xtic 选项让 gnuplot 沿着 x 轴放置 tic 和数据标签(第 1 列)。在这里就是组名称。但是,有时候标签包含许多字符,或者 xtic 的时间格式在图形上的 tic 之间放不下。这时就会看到标签相互重叠。为了避免这个问题,把标签旋转 90 度(通过试验找到合适的角度),让它们垂直显示。可以使用以下命令来实现这种效果:

    set xtic rotate by 90

    第 2 列中的数据使用第 1 列(x 数据)作为参照:

      2:xtic (1)

    在生成图形时,给数据加上标题 “apps groups numbers”:

    plot "grpdata.txt" using 2:xtic(1) title "apps group numbers"

    使用以下命令生成图像 grpimage.png:

    $ cat grphist.conf | gnuplot

    清单 5 包含生成图像的 gnuplot 命令,输出见 图 3

    清单 5. grphist.conf
    # grphist.conf
    set terminal png truecolor
    set output "grpimage.png"
    set grid
    set xtic rotate by 90
    set style data histograms
    set style fill solid 1.00 border -1
    plot "grpdata.txt"  using 2:xtic(1) title "apps group numbers"
    图 3. grpimage

    图 3. grpimage

    当然,可以像 sar 示例一样在柱状图中绘制多组数据。现在看看另一个数据源。清单 6 中的数据反映三个月内磁盘阵列中数据的增减。第 1 列是磁盘阵列名称,第 2 列是第一个月的磁盘使用量,第 3 列是下一个月的磁盘使用量,最后一个月的数据在第 4 列中。

    清单 6. disk.txt
    hdisk2 420 425 410
    hdisk3 700 780 760
    hdisk4 450 450 452
    hdisk5 680 702 690
    hdisk6 320 330 329
    hdisk7 530 515 514

    生成图形的配置文件见 清单 7。在 plot 命令中,同样使用 xtic 命令修改 x 轴数据的显示方式。在生成柱状图时,第 2、3 和 4 列使用 x 轴作为参照点。因此指定第 2 列使用 x 轴作为参照:

    2:xtic(1)

    gnuplot 假设要绘制的其他列也参照 x 轴,所以在 plot 命令中不需要再指定 xtic:

    plot "disk.txt"  using 2:xtic(1) title "Oct-09 data growth(gb)", '' using 3 title "N
    ov-09 data growth(gb)", '' using 4 title "Dec-09 data growth(gb)"

    使用以下命令生成图像:

    $ cat diskhist.conf | gnuplot

    产生的图像见 图 4

    清单 7. diskhist.conf
    # diskhist.conf
    set terminal png truecolor
    set output "diskimage.png"
    set grid
    set style data histograms
    set style fill solid 1.00 border -1
    plot "disk.txt"  using 2:xtic(1) title "Oct-09 data growth(gb)", '' using 3 title "N
    ov-09 data growth(gb)", '' using 4 title "Dec-09 data growth(gb)"
    图 4. diskimage

    图 4. diskimage

    结束语

    可 以使用 gnuplot 从各种数据生成不同的图形。要想使用 shell 脚本自动执行图形生成,我建议使用 'here' 文档方法,可以通过这个过程使用 gnuplot 动态地生成图形。要想禁止 Web 服务器缓存图形,应该在脚本中使用适当的 HTML META 标记(例如 ‘no-cache’ 语句)。

  • 相关阅读:
    微服务架构有哪些优势?
    Java 线程数过多会造成什么异常?
    Java 死锁以及如何避免?
    抽象的(abstract)方法是否可同时是静态的(static), 是否可同时是本地方法(native),是否可同时被 synchronized 修饰?
    内部类可以引用它的包含类(外部类)的成员吗?有没有 什么限制?
    CSS选取第几个标签元素:nth-child、first-child、last-child
    数据库约束
    DQL查询语句
    网络编程(客户端,服务端文件上传下载)
    缓冲流,转换流
  • 原文地址:https://www.cnblogs.com/helloWaston/p/4539202.html
Copyright © 2020-2023  润新知