閱讀626 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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:https://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 https://www.gnuplot.info/faq/
        Send bug reports and suggestions to <https://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’ 語句)。

最後更新:2017-04-03 18:52:01

  上一篇:go 阿裏80億貸款細節曝光 並購背後圖謀大數據
  下一篇:go 英特爾開源OpenGL驅動快於蘋果驅動