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

 

 

 

 

 

 

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