linux中使用gnuplot使您的數據可視化
基礎
通過在 shell 命令提示符中輸入 gnuplot 啓動 gnuplot。您首先看到提示符號 >。該提示符是進入 gnuplot
的輸入點;Linux 用戶將習慣於這種方式。例如,您可以使用方向鍵來查找以前輸入的命令歷史記錄,然後編輯和重新執行這些命令;Home 和 End
鍵與平時使用沒有區別。可以對 gnuplot 進行重新編譯以便使用 GNU readline 庫在輸入提示符上來回移動,但類似於默認函數。
Gnuplot 提供了廣泛的在線幫助,如果您要做任何有用的事情,則肯定會用到這些在線幫助。語法是統一的:通過輸入 help
我們剛剛創建了可能是最簡單的圖。讓我們看看如何以不同方法定製該圖。假設我們只想看到一個正弦曲線週期。我們通過限制圖的默認 x
範圍來完成此操作。使用表示法 [min:max] 來指定範圍。要僅指定最小值,使用 [min:];要僅指定最大值,使用
[:max]。數學上稱此爲所謂的“閉”區間表示法。
這裏我們使用 [-pi:pi] 得到一個正弦曲線週期:
清單 1. 從 -pi 到 +pi 的 sin(x)
set xrange [-pi:pi]
replot
reset
我們剛纔使用了 replot 命令,它執行先前的 plot
命令。當您繪製曲線圖且需要不斷對該圖進行修改以添加想要的特徵時,此命令會非常有用。另外,replot 使您可以添加更多的圖。嘗試輸入
replot cos(x)。依照語法,該命令等同於 plot sin(x), cos(x)。Replot
就是獲取先前的繪圖字符串,添加必要的逗號,然後附加輸入給它的其餘部分。
使用的最後一個命令 reset 對於繪製正弦曲線不是必要的。它移除先前所有 set 命令的效果並恢復默認值。因此,在本例中,它將使用默認 x 範圍。
現在讓我們嘗試一些更奇特的東西:plot sin(x)/x。您應該看到如下所示圖形:
從剛纔這三個簡單的例子,您可以看到 gnuplot 能夠理解 pi
並具有豐富的自帶數學函數詞彙表。它甚至知道非常有用的管理正態分佈的統計函數,以及深奧的特殊函數,如朗伯、貝塞爾、beta 和 gamma
函數(還有更多!),這些函數通常僅在 mathematica 等功能齊全的數學工具中纔會有。根據經驗,語法與 C 中的語法相似,C
中的語法又與平常數學中使用的語法相似。(一個重要的不同是指數的表示法:爲了方便,x 的 y 次冪寫爲 x**y)。
接着,將圖命名爲(“My First Graph”),並命名軸(x 軸是“angle, in degrees”,y 軸是“sin(angle)”)。
清單 2. 命名圖和軸
set title "My first graph"
set xlabel "Angle, /n in degrees"
set ylabel "sin(angle)"
plot sin(x)
注意 xlabel 中的 /n 會產生新的一行。一般來說,gnuplot 在雙引號內的字符串中進行類似於 C 的反斜槓處理。Windows
用戶注意:如果您想文件名使用雙引號括起來的字符串表示,則必須使用兩個反斜槓:如
"c://developerworks"(或者可以使用一個正斜槓:"c:/developerworks")。
現在,我
們注意到 x 軸實際沒有標記爲度數,看起來不是很好。要修改此問題,通過調整 x 軸上的 tic 標記,使指定的(主)標記僅以 90
度增加和輔標記以 45 度增加。主 tics 的“級別”爲 0,這是默認值;輔 tics 的級別爲 1。每個點分別由一個 3
元組指定:"label"(放在引號中)、
和
。
清單 3. 改變軸上 tic 並設置網格
set xrange [-pi:pi] # we want only one cycle
set xtics ("0" 0, "90" pi/2, "-90" -pi/2, "" pi/4 1, "" -pi/4 1, "" 3*pi/4 1, "" -3*pi/4 1)
set grid
set xlabel "Angle,/n in degrees"
set ylabel "sin(angle)"
plot sin(x)
注意對 +45 度和 -45 度輔標記使用了空標籤 ("")。還要注意我們不必以任何順序列出點。像 gnuplot
中的其他所有項一樣,xtics 命令功能非常多,具有方便的選項,用於以固定增量創建 tic
標記(在對數標度中爲正常倍數),以及用於時間相關數據的特殊格式。查看 help set xtics 中的例子可以獲得更多信息。
作爲邊注,注意我們使用反斜槓將 xtics 命令擴展成多個輸入行。這樣可以使比較長或比較複雜的命令更易讀懂。
我們還用 set grid 來設置網格,該命令使您可以從數量上查看圖。到現在爲止,我們大量地使用了 set 命令。Gnuplot
有一種撤銷設置的統一方法:在 gnuplot 4.0 中,命令是 unset。例如,如果您不想要網格,使用 unset grid。4.0
以前的版本,命令是 set nogrid。
順便說一下,我們提供的所有例子都可以在交互模式或批處理模式下運行。要以交互
模式運行,在提示符中輸入每個命令。要以批處理模式運行,將命令輸入或添加到文本文件中,然後在 gnuplot 提示符中使用 load
'filename' 讀入文件,或者在 shell 提示符下將其作爲參數提供給 gnuplot:$ gnuplot
filename。使用第二種方法,gnuplot
會在執行輸入文件中的所有命令後退出,所以當直接繪圖到文件中(請參見下一節)時,採用批處理模式執行特別有效。如果在屏幕上繪圖時使用第二種方法,輸出
窗口一出現(當 gnuplot 退出時)就會消失,所以您需要使用顯式的“pause -1”命令(請參閱 help pause)來保持窗口。
批處理模式操作中使用的 Gnuplot 命令文件往往停留一會,從而幫助使用註釋來提高可讀性。# 後面的直到行結束的內容是註釋。所以在示例清單 3 中,gnuplot 不處理 we want only one cycle。
終端設備 ―― 題外話
在啓動時,您可能注意到終端類型設置爲 X11。Gnuplot 採用標準設計,可以在多個終端設備上繪圖。這包括直接打印到多種打印機中,包括
Epson、HP 和 Imagen 打印機。它甚至可以在僞設備中繪圖,如 postscript 和
png。這主要涉及生成輸出文件,而不是可查看文件或打印輸出。這是將您的圖表包含在其他報表中的一種技巧。雖然我還沒有發現在 Windows 中與在
Linux 中有什麼不同,本文檔建議您在設置輸出文件名之前先設置終端類型:
清單 4. 設置輸出和終端類型
set terminal png # gnuplot recommends setting terminal before output
set output "output.png" # The output filename; to be set after setting
# terminal
replot
現在,文件 output.png
中有了您剛纔繪製的圖,且可以包含在一個更大的報表中。許多普遍使用的排版和製圖程序都有專門的終端,這些程序包括 Adobe
Illustrator(set term aifm)、Corel Draw(set term corel)、AutoCad(set term
dxf)和多種 LaTex 相關的終端(eepic、latex、pstricks、texdraw、tpic 等等)。您還可以得到
PostScript、enhanced PostScript (eps) 或 Adobe PDF 格式的文件。您的 gnuplot
版本可能沒有編譯所有的終端驅動程序 ―― 例如,Windows 用戶不需要 Xll 終端,Linux 用戶不需要 Windows
終端。類似地,出於法律原因,gnuplot 4.0 移除了對 gif 終端的支持。
所有終端在能力上都不相同。其中的一
些(如 LaTeX)可能不支持文本的旋轉,所以如果您像我們前面那樣設置 ylabel,在不同的終端中可能顯示不一樣。換句話說,您可以在
LaTeX 的特定終端中使用 LaTex 命令。例如,set ylabel "$sin(//theta)$"(注意我們使用兩個反斜槓產生一個
LaTex 所需的反斜槓 ―― gnuplot 在將雙引號中所括的字符串傳送到終端驅動程序之前,先對其進行反斜槓處理)。現在,您可以使用
/input{output.tex} 將輸出文件包含在 LaTeX 文件中。要在 PostScript 終端中獲得相同的結果,使用相應的
PostScript 命令:{/Symbol q}。在 enhanced PostScript 和 LaTeX 中,您可以使用表示法
x^{superscript} 和 x_{subscript} 得到上標文字。還要注意縮寫的終端
繪製數據圖
雖然本教程只是出於說明目的,大部分內容都集中於繪製正弦曲線,您很可能很想對試驗數據、銷售數據或其他類似數據繪圖。在這一節,我們將使用 IBM 的股票價格作爲數據集合說明如何繪製不同的圖(本例的原始數據包含在參考資料部分中):
表 1. IBM 股票價格
大多數數據集合都是數字列,但是這個數據集合有所不同,因爲 x 軸是時間數據。下列代碼告訴 gnuplot 如何讀取和格式化 x 軸上的時間數據(有關詳細信息,請參閱 help time/data 和 help set timefmt):
清單 8. 設置時序數據
set xdata time # The x axis data is time
set timefmt "%d-%b-%y" # The dates in the file look like 10-Jun-04
set format x "%b %d" # On the x-axis, we want tics like Jun 10
一旦設置完成,可以使用下列命令對開盤價繪圖。我們選擇在不同的開盤價之間使用直線插值法,並使用 linespoints 樣式,而不只是 points:
plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2 with linespoints
象往常一樣,["31-May-04":"11-Jun-04"] 顯式設置了 xrange,但不是完全必要的。注意範圍的 min 和 max 需要指定爲符合 timefmt 的字符串。
取決於使用的繪圖樣式,gnuplot 在繪製一個點時最多可以使用六個不同的編號。當讀入記錄時,列從 1 開始編號。using 1:2 告訴 plot 命令使用第一列作爲 x 軸,第二列作爲 y 軸。所以要繪製收盤價圖,我們將使用 using 1:5。
每次 gnuplot 看到新的數據分隔符時,列編號就會增加。默認情況下,數據分隔符爲空格。所以如果時間格式中間有空格(例如 10 Jun
04,而不是 10-Jun-04),我們將需要使用 using 1:4 代替 1:2。對於 x
軸,我們僅需要指定數據開始的第一列。Gnuplot 能夠智能地使用 timefmt 字符串讀取其他列。
using
使您可以添加兩個以上的冒號,用於指定特定繪圖樣式可能需要的任何其他列。您還可以使用 $n 表示第 n
列,從而對二進制表達式進行繪圖。在一個完全虛構的示例中,我們假設不同的價格表示不同的試驗運行,我們要繪製平均價、最高價和最低價。
yerrorbars 樣式使您可以繪製 y-high/y-low 值(我們在 using 修飾符中指定爲 x:y:ylow:yhigh)以及計算
y 軸四個價格的平均值爲 ($2+$3+$4+$5)/4:
plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:($2+$3+$4+$5)/4:4:3 /
title 'daily prices, IBM' with yerrorbars
errorlines 樣式是相似的,但它還在繪製的 y 軸點之間繪製線段。對於繪製財務條形圖,Gnuplot
還有單獨的樣式,分別是最高價、最低價和 tics 在左邊,右邊爲開盤價和收盤價。我們使用 set bars 顯示開盤價和收盤價的較大
tics):
set bars 5
plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2:3:4:5 with financebars
您還可以查看 help plotting styles 獲得其他相關樣式,如 candlesticks、boxerrorbars 和錯誤繪圖樣式。
處理真實數據集合
當然,對於真實的數據集合,事情可能會變得更復雜。最常見的就是數據集合不使用空格字符分隔數據點。gnuplot 4.0 提供了新的功能,您可以使用 set datafile separator
指定自己的分隔符。同樣地,您還可以使用 set datafile commentschar 指定除了 #
之外的註釋字符。如果需要更多的控制,您可以爲 using 修飾符明確指定格式字符串。Gnuplot 使用 C 標準庫的 scanf
函數以及給定格式字符串(有關詳細信息,請參閱 help
using)讀入數據。我講述此方法僅是爲了內容更全面;能夠以此方法讀入的數據集合也可以使用 set data file separator
進行處理,或者通過顯式指定 using 修飾符中要使用的列編號來進行處理。例如,如果需要忽略第一列中的字符串,則使用 2:3
進行繪圖。爲了獲得更完全的靈活性,在具有 popen 函數的 Unix 類系統中,在將文件傳送給 plot
命令之前,可以使用文本處理實用程序對文件進行預處理。例如:plot "< awk --f preprocess.awk
data.file"。不幸的是,該命令不能在所有系統中使用。最後的一個方法是在 gnuplot 中使用輸入文件之前對其進行預處理。
有時,真實的數據可能沒有包含所有的點 ―― 對於要繪圖的列,可能有 x 值,但缺少相應的 y 值。Gnuplot 允許您指定字符串,用於表示缺少的數據點。例如:
set datafile missing 'NaN' # The IEEE floating point not-a-number
注意,在 4.0 版本之前,命令是 set missing 。
不幸的是,處理缺少數據的數據點的方法取決於 using 說明。如果想了解用法 plot 'file'、plot 'file' using
1:2 和 plot 'file' using ($1):($2) 之間區別的詳細信息,請參閱 help
using。但是爲了安全起見,通常指定列使用顯式的 using
格式,如果您想完全清除不合適的數據點,不要使用表達式求值(第三個選項會因爲括號而對表達式求值)――
而是,預處理數據文件並用計算的表達式的結果添加確切的列。
往常,您可能以一些無效的數據點而結束。如果 gnuplot
被告知忽略無效數據點,您仍可以對這樣的數據集合繪圖。Gnuplot 忽略未定義的點,這樣當您遇到不合適的點時,技巧就是使用未定義的 y
值,如1/0。類似於 C 的三元算符可以很容易地表達此信息(如果您不熟悉此函數,請參閱 help
ternary;在定義分段函數時它也非常有用)。下面是 help using 中介紹的一個例子,它使您以第二列作爲 y 值來繪圖,除非第三列大於
10:
plot 'file' using 1:($3>10 ? $2 : 1/0)
高級例子
雖然本文向您展示了會經常使用的大多數命令,但可能有些地方您還需要進一步地研究。在這一節,我們簡要討論其中一些概念,然後提供了其中一個
gnuplot 演示文件(electron.dem)中的腳本,該腳本繪製電子學中常見的幅頻響應圖,用以說明它們的用法。
用戶定義的函數和變量
您可以任意定義自己的複雜函數,如下面的 A(jw)。這些函數可以用參數 (p1, p2) 表示,您可以稍後在 plot 命令中使用它們之前再定義參數變量。
複數
Gnuplot 可以識別複數。{a,b} 表示複數 a+bi。您可以使用函數 abs() 和 arg() 獲得絕對值和輻角。
虛變量
當在 plot 命令中使用 sin(x) 時,gnuplot 將 x 用作虛變量,並對它賦不同的值以獲得示例。當編寫複雜的用戶定義的函數時,您可以使用函數定義中使用的傳統變量名稱,也可以顯式設置要使用的虛變量的名稱(例如,set dummy jw)。
x2 和 y2 軸
除了常見的沿着曲線圖底部和左邊的 x 軸和 y
軸之外,還可以使用曲線圖的頂部(x2)和右端(y2)作爲單獨的軸。這些軸都相互獨立,可以單獨設置範圍、tics、標籤和比例(例如對數刻度)。而
且,通過使用 axes 子句,plot 命令可以使用不同的軸集合,如 x2y2。默認情況下,plot 命令以 x 軸和 y
軸繪圖。當您需要同時繪製範圍爲不同量級或具有不同單位的線時,此高級功能非常有幫助。在下面的示例中,y 軸繪製振幅,最大值爲 1,y2
軸繪製相位,最大值爲 100。如果對軸的相同集合繪圖,振幅曲線幾乎看不出來。
對數刻度
您可以使用 set
logscale 命令以對數刻度繪製任何軸。此命令在軸上繪製以 10 爲底的值的對數。您可以顯式設置使用的底數(例如,set logscale
2,或如果僅爲 x 主軸和 y 主軸設置底數,則可以使用 set logscale xy 2)。
下例摘自與 gnuplot 一起提供的演示文件 electron.dem。此腳本使用了上面討論的所有高級概念:
清單 9. 幅頻響應
A(jw) = ({0,1}*jw/({0,1}*jw+p1)) * (1/(1+{0,1}*jw/p2))
p1 = 10
p2 = 10000
set dummy jw
set grid x y2
set key default
set logscale xy
set log x2
unset log y2
set title "Amplitude and Phase Frequency Response"
set xlabel "jw (radians)"
set xrange [1.1 : 90000.0]
set x2range [1.1 : 90000.0]
set ylabel "magnitude of A(jw)"
set y2label "Phase of A(jw) (degrees)"
set ytics nomirror
set y2tics
set tics out
set autoscale y
set autoscale y2
plot abs(A(jw)), 180/pi*arg(A(jw)) axes x2y2
結束語
在本文中,我們討論了使用新發布的 gnuplot 4.0 繪製 2D 圖形的複雜性。雖然我們接觸了大多數的關於使用 gunplot
的重要方面,但限於篇幅有限,我們仍有少數主題沒有討論。值得注意的一些省略範圍包括從非常簡單的參數函數繪圖(請參見 help
parametric)、極座標(help polar),到曲線擬合(它使用戶定義曲線與