原文: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.rpmexpat-2.0.1-2.aix5.1.ppc.rpm freetype2-2.3.9-1.aix5.1.ppc.rpmzlib-1.2.3-5.aix5.1.ppc.rpm libpng-1.2.40-1.aix5.1.ppc.rpmgd-2.0.35-4.aix5.1.ppc.rpmlibjpeg-7-1.aix5.1.ppc.rpmlibXpm-3.5.7-2.aix5.1.ppc.rpm gettext-0.17-1.aix5.1.ppc.rpmglib2-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/gnuplot>Terminal type set to 'unknown'gnuplot>
用 sar 创建图形
sar 可能是最常用的收集性能数据的方法,所以我们以它作为示例。清单 1(sarx.txt)是通过运行 sar 收集的数据,数据收集时间为 5 小时,每小时收集一次,输出已经经过筛选。
清单 1. sarx.txt
14:10:50 33 27 4 36 4.0015:10:50 29 14 3 28 4.0016:10:50 35 21 1 31 4.0017:10:49 38 29 2 39 4.0018: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 timeset 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
图 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 默认颜色的次序为:
backgroundborder XYplotting 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. sarx2.conf
图 2. sarimage2
gnuplot 和柱状图
还可以使用柱状图或框图表示数据,有时候这比使用静态数据更合适。清单 4 是从一台 AIX 机器获得的用户组用户总数。第 1 列包含 AIX 组名,第 2 列包含成员总数。
清单 4. grpdata.txt
staff 54apps 22sybgrp 12db2grp1 29dasdm 8dstage 21dsgrp 8batch 28db2prd 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
图 3. grpimage
当然,可以像 sar 示例一样在柱状图中绘制多组数据。现在看看另一个数据源。清单 6 中的数据反映三个月内磁盘阵列中数据的增减。第 1 列是磁盘阵列名称,第 2 列是第一个月的磁盘使用量,第 3 列是下一个月的磁盘使用量,最后一个月的数据在第 4 列中。
清单 6. disk.txt
hdisk2 420 425 410hdisk3 700 780 760hdisk4 450 450 452hdisk5 680 702 690hdisk6 320 330 329hdisk7 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 "Nov-09 data growth(gb)", '' using 4 title "Dec-09 data growth(gb)"
使用以下命令生成图像:
$ cat diskhist.conf | gnuplot
产生的图像见 图 4。
清单 7. diskhist.conf
图 4. diskimage
结束语
可以使用 gnuplot 从各种数据生成不同的图形。要想使用 shell 脚本自动执行图形生成,我建议使用 'here' 文档方法,可以通过这个过程使用 gnuplot 动态地生成图形。要想禁止 Web 服务器缓存图形,应该在脚本中使用适当的 HTML META 标记(例如 ‘no-cache’ 语句)。