gnuplot 讓您的數據可視化

Gnuplot 是一種免費分發的繪圖工具,能夠移植到各類主流平臺。它能夠下列兩種模式之一進行操做:當須要調整和修飾圖表使其正常顯示時,經過在 gnuplot 提示符中發出命令,能夠在交互模式下操做該工具。或者,gnuplot 能夠從文件中讀取命令,以批處理模式生成圖表。例如,若是您正在運行一系列的實驗,須要每次運行後都查看結果圖表;或者當您在圖表最初生成好久之後須要返回圖表修改某些內容時,批處理模式能力會特別有用。當在 WYSIWIG 編輯器中很難捕獲用於修飾圖表的鼠標單擊事件時,您能夠很容易地將 gnuplot 命令保存在文件中,六個月後將其加載到交互式會話中從新執行。 html

Gnuplot 是在 1986 年由 Colin Kelley 和 Thomas Williams 最初開發的。許多參與者都在爲不一樣的「終端」建立變種方面作出了貢獻。在 1989 和 1990 年,這些變種被合併到 gnuplot 2.0 中。2004 年 4 月,發佈了 4.0 版本。本教程將適用於 4.0 版本,可是這裏介紹的大多數命令應該也適用於其餘版本。在適當的地方,我將說起其中的主要區別。 參考資料中列出了 gnuplot 的官方 Web 站點。 linux

下面,咱們爲初學者提供了實踐指南;可是即便您之前有一些 gnuplot 的經驗,您也可能會在 4.0 版本中發現新的慣例和命令。咱們從簡單的正弦曲線開始,將其定製爲咱們所但願看到的形狀。而後咱們將研究如何繪製一組數據點。在本文中,咱們僅限於 2D 繪圖,由於它們是最多見的。 shell

GNG:Gnuplot 不是 GNU

雖然它的名稱可能意味着其餘方面,但 GPL 不包含 gnuplot。對於法律方面,gnuplot FAQ #1.7 指出:「從您沒必要爲其付錢方面來說,Gnuplot 是免費軟件。不過從您不能免費分發 gnuplot 的修改版本方面來說,它又不是免費軟件。請閱讀和接受發行版中的版權文件。」安全

初學用戶時常可以很好地想出他們的圖表形狀,可是不知道須要使用什麼 gnuplot 命令。因此瞭解 gnuplot 的關鍵是很好地掌握它的詞彙表,其他應該憑足夠的直覺。在本教程中,我僅能對您將在 gnuplot 中充分使用的通用選項提供一個瞭解;本教程並非毫無遺漏的。因此,例如,我告訴您如何設置 x 範圍來限制圖表中 x 軸的範圍。設置 y 範圍與 x 範圍類似(在命令中使用 yrange,而不是 xrange ),但我將再也不討論。 electron

基礎編輯器

經過在 shell 命令提示符中輸入 gnuplot 啓動 gnuplot。您首先看到提示符號 > 。該提示符是進入 gnuplot 的輸入點;Linux 用戶將習慣於這種方式。例如,您可使用方向鍵來查找之前輸入的命令歷史記錄,而後編輯和從新執行這些命令;Home 和 End 鍵與平時使用沒有區別。能夠對 gnuplot 進行從新編譯以便使用 GNU readline 庫在輸入提示符上來回移動,但相似於默認函數。 ide

Gnuplot 提供了普遍的在線幫助,若是您要作任何有用的事情,則確定會用到這些在線幫助。語法是統一的:經過輸入 help <command> 能夠得到任何命令的幫助。接着啓動 gnuplot,嘗試命令 help set yrangehelp set(在每一個命令以後,使用 q 退出幫助)。注意 yrangehelp set 下的可用子選項之一。通常來講,gnuplot 幫助爲命令的全部可能定製提供進一步的幫助。瀏覽幫助中的示例部分一般就足能夠了解如何使用命令。 函數

Gnuplot 還有大量展現其能力的演示,一般位於安裝的演示子目錄中。爲了得到這些能力,在 gnuplot 提示符下進入此目錄中(例如, cd '/opt/gnuplot/demo' — 注意 gnuplot 要求全部文件名和目錄名都用單引號或雙引號括起來),而後輸入 load 'all.dem' 。該目錄中的各個 .dem 文件演示了各個函數,all.dem 將它們一次所有加載。但您可能想將此操做延遲到本文結束時進行,這樣咱們能夠開始使用 gnuplot ,無需再進行其餘操做... 工具

對於那些想要繼續的人,能夠在提示符中分別輸入代碼清單中的每行代碼。或者,將整個清單保存到一個臨時文件中,而後經過在 gnuplot 提示中輸入 load 'filename' (不要忘記引號)來運行代碼。 post

能夠預見的是,2D 繪圖的命令是 plot 。在提示符中輸入 plot sin(x) :您應該在彈出窗口中看到熟悉的正弦曲線。


圖 1. sin(x)
圖 1. sin(x)

咱們剛剛建立了多是最簡單的圖。讓咱們看看如何以不一樣方法定製該圖。假設咱們只想看到一個正弦曲線週期。咱們經過限制圖的默認 x 範圍來完成此操做。使用表示法 [min:max] 來指定範圍。要僅指定最小值,使用 [min:];要僅指定最大值,使用 [:max]。數學上稱此爲所謂的「閉」區間表示法。

這裏咱們使用 [-pi:pi] 獲得一個正弦曲線週期:


清單 1. 從 -pi 到 +pi 的 sin(x)
set xrange [-pi:pi]
replot
reset


圖 2. 重繪正弦曲線圖
圖 2. 重繪正弦曲線圖

咱們剛纔使用了 replot 命令,它執行先前的 plot 命令。當您繪製曲線圖且須要不斷對該圖進行修改以添加想要的特徵時,此命令會很是有用。另外,replot 使您能夠添加更多的圖。嘗試輸入 replot cos(x)。依照語法,該命令等同於 plot sin(x), cos(x) 。Replot 就是獲取先前的繪圖字符串,添加必要的逗號,而後附加輸入給它的其他部分。

使用的最後一個命令 reset 對於繪製正弦曲線不是必要的。它移除先前全部 set 命令的效果並恢復默認值。所以,在本例中,它將使用默認 x 範圍。

如今讓咱們嘗試一些更奇特的東西: plot sin(x)/x 。您應該看到以下所示圖形:


圖 3. sin(x)/x
圖 3. 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" (放在引號中)、 <point-at-which-tic-is-made><optional-level>


清單 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)


圖 4. 帶有 tics、標題、網格和標籤的軸的 sin(x)
圖 4. 帶有 tics、標題、網格和標籤的軸的 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 相關的終端( eepiclatexpstrickstexdrawtpic 等等)。您還能夠獲得 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} 獲得上標文字。還要注意縮寫的終端和輸出命令:


清單 5. eps 驅動程序的能力
set term post enh  		 # enhanced PostScript, essentially PostScript
 		 		 # with bounding boxes
set out 'gplt.eps'
set xlabel '{/Symbol q_1}
set ylabel 'sin^2({/Symbol q_1})'
plot sin(x)**2

參考資料部分的代碼補充說明包含具備以上命令的 TeX 文件示例。

鼠標支持

版本 4.0 提供了新的功能,Windows 和 X11 終端支持鼠標交互。鼠標支持有兩個主要用途:座標跟蹤和縮放。鼠標指針的當前座標顯示在終端窗口的左下角。經過雙擊第一個鼠標按鈕能夠將其複製到剪貼板中。當您須要設置須要直接座標的標籤或箭頭時,此操做會很是有用。(使用 help arrowhelp label 能夠得到這些命令的更多詳細信息。)還能夠拖動第二個(或右擊)鼠標按鈕來選擇要放大的矩形區域。在 3D 繪圖中,您能夠拖動鼠標來旋轉圖像(按住 Ctrl 鍵將僅更改軸的視圖;因此對於要用很長時間才能呈現的圖,能夠先更改軸,而後放開 Ctrl 鍵來從新呈現圖)。

鼠標支持還支持一組有用的熱鍵:若是先前對圖進行了放大, u則取消訪大。 g切換網格, l切換座標軸上的刻度; L切換最靠近指針的最標軸上的刻度, r切換標尺,標尺會創建任意原點。啓用了標尺後,屏幕的底部顯示當前座標指針距離標尺原點的 x 軸距離和 y 軸距離以及距離實際原點的 x 軸和 y 軸距離(與點的座標相同)。在 3D 中,方向鍵能夠用在鼠標拖拉的地方來旋轉圖像。空格鍵激活命令窗口, q退出終端窗口。要查看全部選項,在支持鼠標的終端中輸入 h

控制比例和長寬比

默認狀況下,gnuplot 對 x 軸和 y 軸都使用比例係數 1,可是它對控制圖形的長寬比(y 軸長度與 x 軸長度的比率)不起做用。終端驅動程序使用終端的默認長寬比。比例係數、長寬比或者二者均可以使用 set size 命令指定,例如:

# square is synonymous to an aspect ratio of 1;
# scale y-axis by 2, retain x-axis size
set size ratio square 1,2

gnuplot 使用給定的長寬比可否成功繪製圖可能受到終端能力的限制。 set size 也是與 multiplot 命令一塊兒使用纔有用,multiplot 命令用於在同一輸出屏幕或文件中生成多個圖。

回頁首

繪製多條曲線

正如精明的讀者可能已經從上面關於 replot 的註釋中推測到的,gnuplot 使您能夠同時畫多條線。假設咱們同時繪製正弦和餘弦曲線。簡單的 plot 命令爲 plot sin(x), cos(x);要畫的曲線以逗號分隔。若是再也不指定其餘項,gnuplot 自動顯示兩個曲線圖,從而它們能夠互相區別 —— 在諸如 Windows 和 Xll 的終端中,gnuplot 使用不一樣的顏色。單色終端使用不一樣種類的線顯示曲線圖。經過查看圖例(或鍵),您應該可以知道圖中的線分別是何種曲線。gnuplot 還容許您指定繪圖的樣式,以便得到進一步的控制:

unset xtics # keep all other things simple
plot sin(x) with linespoints pointtype 5, cos(x) w boxes lt 4


圖 5. 多條曲線
圖 5. 多條曲線

with 子句(請參閱 help plot with ,若是使用版本 4.0,還有 help plotting styles )使您能夠詳細而精確地指定線的樣式。在本例中,咱們說明兩種有用的樣式。第一種樣式 linespoints 一般在對數據繪圖時很是有用,它在涉及的每一個示例或數據點處標記一個點,並使用線性插值法鏈接連續的點。這裏咱們另外指定點類型爲 5,它選擇終端容許的第五種點。第二種樣式 boxes 更適合繪製直方圖數據。注意咱們如何在 cos(x) 曲線中將 with 縮寫成 w 。相似地, lt是 linetype 的縮寫,是另外一個特定於終端的設置,它選擇終端能夠繪製的四種線。沒必要說(什麼,您尚未嘗試 help plot with嗎?),您可使用 pt 代替冗長的 pointtype。若是想在多條線中使用相同的繪圖樣式(在一個 plot 命令中或在多個 plot 命令中),可使用 set 命令設置繪圖樣式。在 gnuplot 4.0 中,使用 set style function linespoints ;之前的版本使用語法 set function style boxes。要更改用於繪製與函數相對的數據集合的樣式,使用 set style data linespoints(之前的版本使用 set data style linespoints )。

gnuplot 如何工做

除了趣味性,本次練習顯示了 gnuplot 實際如何對函數繪圖 —— 它獲取多個樣本並在每一個樣本點繪製值。一般,它會在這些點間平滑地插入值;使用 boxes 樣式則強制它使用平面的直方圖,linespoints 樣式用一個點標記每一個樣本。要更清楚地觀看,顯式地將採樣比率設爲 10( set samples 10 )並從新繪圖。(而後將其設置會默認值 100)。

with 子句是咱們使用除了 set 以外的其餘項來定製圖的第一個例子。一些其餘廣泛使用的選項也能夠直接在 plot 命令中設置。例如,還能夠設置 xrange: plot [-pi:pi] sin(x)。對默認繪圖選項的快速而隨意的一次性更改則使用此類語法。要在多個圖中或在多個 plot 命令中從新使用,須要使用 set 命令。

當繪製兩條或多條曲線時,咱們須要關鍵字或圖例來對它們進行區分。默認狀況下,關鍵字在右上角;可是若是它妨礙了圖,能夠將關鍵字放到其餘位置 —— 若是願意,甚至能夠放到圖外。下面的代碼片斷將關鍵字放在了左上角,並在它周圍設置了一個框。咱們還經過在 plot 命令中給定明確的標題來控制圖例中爲曲線提供的名稱。title 能夠縮寫爲 t,正如咱們對餘弦曲線的設置。若是不想在圖例中命名曲線,使用 notitle ,而不是 title 。最後一點,也是新用戶常常出錯的地方就是若是有標題,標題必須放在 with 子句的前面:


清單 6. 定製圖的關鍵字或圖例
set key top left
set key box
plot [-pi:pi] sin(x) title "sinusoid" with linespoints pointtype 5, \
cos(x) t 'cosine' w boxes lt 4


圖 6. 定製關鍵字
圖 6. 定製關鍵字

在同一屏幕上繪製相關的圖

上面,咱們在同一圖中繪製了正弦和餘弦曲線。Gnuplot 使您還能夠繪製多個圖,這樣它們能夠並排顯示在同一輸出屏幕或文件中。在某些排版系統中,以一個文件的形式包含兩個圖形比分別包含兩個圖形要更容易。

下面是簡單說明的 multiplot ,它繪製正弦、餘弦及其各自倒數的曲線圖。基本方法是將屏幕或圖像文件的邊框比例設爲 1。而後,咱們繪製不一樣的曲線圖,從而它們能夠每一個圖佔據屏幕的四分之一。咱們還經過使用屏幕座標(請參閱 help coordinates ,得到關於不一樣類型座標系統的討論)設置原點來控制曲線圖顯示的位置。另外,注意每一個 plot 還自動計算軸、tic 等等的寬度 —— 這樣您可能必須調整邊距寬度以使不一樣繪圖的軸排成一行。在本例中,我必須將左邊距設置爲 6 個字符寬度,以便調整 cosec(x) = 1/sin(x) 的科學記數法中的 tics。


清單 7. Multiplot 示例
set xrange [-pi:pi]
# Uncomment the following to line up the axes
# set lmargin 6
# Gnuplot recommends setting the size and origin before going to
# multiplot mode
# This sets up bounding boxes and may be required on some terminals
set size 1,1
set origin 0,0
# Done interactively, this takes gnuplot into multiplot mode
# and brings up a new prompt ("multiplot >" instead of "gnuplot >")
set multiplot
# plot the first graph so that it takes a quarter of the screen
set size 0.5,0.5
set origin 0,0.5
plot sin(x)
# plot the second graph so that it takes a quarter of the screen
set size 0.5,0.5
set origin 0,0
plot 1/sin(x)
# plot the third graph so that it takes a quarter of the screen
set size 0.5,0.5
set origin 0.5,0.5
plot cos(x)
# plot the fourth graph so that it takes a quarter of the screen
set size 0.5,0.5
set origin 0.5,0
plot 1/cos(x)
# On some terminals, nothing gets plotted until this command is issued
unset multiplot
# remove all customization
reset


圖 7. Multiplot 繪圖
圖 7. Multiplot 繪圖

回頁首

繪製數據圖

雖然本教程只是出於說明目的,大部份內容都集中於繪製正弦曲線,您極可能很想對試驗數據、銷售數據或其餘相似數據繪圖。在這一節,咱們將使用 IBM 的股票價格做爲數據集合說明如何繪製不一樣的圖(本例的原始數據包含在 參考資料部分中):

表 1. IBM 股票價格

日期 開盤 最高 最低 收盤
10-Jun-04 90.23 90.75 89.89 90.46
9-Jun-04 89.90 90.55 89.81 90.09
8-Jun-04 88.64 90.50 88.40 90.04
7-Jun-04 88.75 88.99 88.01 88.64
4-Jun-04 87.95 88.49 87.50 87.56
3-Jun-04 87.85 88.10 87.35 87.35
2-Jun-04 88.64 88.64 87.89 87.98
1-Jun 04 88.00 88.48 87.30 88.12

大多數數據集合都是數字列,可是這個數據集合有所不一樣,由於 x 軸是時間數據。下列代碼告訴 gnuplot 如何讀取和格式化 x 軸上的時間數據(有關詳細信息,請參閱 help time/datahelp 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


圖 8. 繪製開盤價圖
圖 8. 繪製開盤價圖

象往常同樣,["31-May-04":"11-Jun-04"] 顯式設置了 xrange,但不是徹底必要的。注意範圍的 minmax 須要指定爲符合 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


圖 9. 計算平均值
圖 9. 計算平均值

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


圖 10. 繪製財務條形圖
圖 10. 繪製財務條形圖

您還能夠查看 help plotting styles 得到其餘相關樣式,如 candlesticks、boxerrorbars 和錯誤繪圖樣式。

處理真實數據集合

固然,對於真實的數據集合,事情可能會變得更復雜。最多見的就是數據集合不使用空格字符分隔數據點。gnuplot 4.0 提供了新的功能,您可使用 set datafile separator <string> 指定本身的分隔符。一樣地,您還可使用 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 <string>

不幸的是,處理缺乏數據的數據點的方法取決於 using 說明。若是想了解用法 plot 'file'plot 'file' using 1:2plot '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)中的腳本,該腳本繪製電子學中常見的幅頻響應圖,用以說明它們的用法。

  1. 用戶定義的函數和變量
    您能夠任意定義本身的複雜函數,以下面的 A(jw)。這些函數能夠用參數 (p1, p2) 表示,您能夠稍後在 plot 命令中使用它們以前再定義參數變量。
  2. 複數
    Gnuplot 能夠識別複數。{a,b} 表示複數 a+bi。您可使用函數 abs() 和 arg() 得到絕對值和輻角。
  3. 虛變量
    當在 plot 命令中使用 sin(x) 時,gnuplot 將 x 用做虛變量,並對它賦不一樣的值以得到示例。當編寫複雜的用戶定義的函數時,您可使用函數定義中使用的傳統變量名稱,也能夠顯式設置要使用的虛變量的名稱(例如, set dummy jw )。
  4. x2 和 y2 軸
    除了常見的沿着曲線圖底部和左邊的 x 軸和 y 軸以外,還可使用曲線圖的頂部(x2)和右端(y2)做爲單獨的軸。這些軸都相互獨立,能夠單獨設置範圍、tics、標籤和比例(例如對數刻度)。並且,經過使用 axes 子句, plot 命令可使用不一樣的軸集合,如 x2y2。默認狀況下, plot 命令以 x 軸和 y 軸繪圖。當您須要同時繪製範圍爲不一樣量級或具備不一樣單位的線時,此高級功能很是有幫助。在下面的示例中,y 軸繪製振幅,最大值爲 1,y2 軸繪製相位,最大值爲 100。若是對軸的相同集合繪圖,振幅曲線幾乎看不出來。
  5. 對數刻度
    您可使用 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


圖 11. 振幅和相位頻率響應
圖 11. 振幅和相位頻率響應

回頁首

結束語

在本文中,咱們討論了使用新發布的 gnuplot 4.0 繪製 2D 圖形的複雜性。雖然咱們接觸了大多數的關於使用 gunplot 的重要方面,但限於篇幅有限,咱們仍有少數主題沒有討論。值得注意的一些省略範圍包括從很是簡單的參數函數繪圖(請參見 help parametric )、極座標( help polar ),到曲線擬合(它使用戶定義曲線與給定數據集合相匹配)。曲線擬合是一門藝術,須要用一整篇文章來說述,可是請參閱 help fitbeginners_guide and tips 來對它得到初步瞭解。

經常使用技巧

正如咱們所看到的,gnuplot 是高度可定製的。我將以這個最後的技巧來結束本文,它說明如何在多個 gnuplot 會話中重用您的定製。定製的主要命令是 set 命令。您可使用 save set 'filename' 保存當前會話的全部設置。 save var <file>save func <file> 分別保存用戶定義的變量和函數。可是沒法保存傳送到單一 plot 命令的定製(例如, plot [-pi:pi] sin(x) 中的 x 範圍)。這些文件可使用 load <file> 讀回。Gnuplot 還在開始時查找名爲 .gnuplot 的文件。它首先在當前目錄中查找,而後在用戶的主目錄中查找(Windows 中的 USERPROFILE 目錄)。若是找到初始化文件,gnuplot 會執行其中的命令。一些用戶將此方法用於設置終端類型和定義常用的函數或變量。

相關文章
相關標籤/搜索