来源: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
绘图选项的表示
在 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. 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
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
当然,可以像 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
结束语
可 以使用 gnuplot 从各种数据生成不同的图形。要想使用 shell 脚本自动执行图形生成,我建议使用 'here' 文档方法,可以通过这个过程使用 gnuplot 动态地生成图形。要想禁止 Web 服务器缓存图形,应该在脚本中使用适当的 HTML META 标记(例如 ‘no-cache’ 语句)。