linux下通过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’ 语句)。

Could not find/open font when opening font "arial", using internal non-scalable font

安装:# rpm -ivh msttcore-fonts-2.0-3.noarch.rpm 
之后,在msttcore的路径下即可找到ariali.ttf,猜想这应该就是所要的字体库了吧!

设置临时环境变量:
# export GDFONTPATH="/usr/share/fonts/msttcore"、
# export GNUPLOT_DEFAULT_GDFONT="arial"

检查环境变量是否设置成功:
# echo $GDFONTPATH
/usr/share/fonts/msttcore
# echo $GNUPLOT_DEFAULT_GDFONT
arial

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章