級別: 初級
Nishanth Sastry (nishanth_sastry@us.ibm.com), 專(zhuān)職軟件工程師, IBM
2004 年 8 月 01 日
使用 Gnuplot 4.0 將數據和函數轉換為專(zhuān)業(yè)的圖表,Gnuplot 4.0 是一種免費分發(fā)的繪圖工具。本文是 gnuplot 的實(shí)踐指南,著(zhù)重講述了有效使用此工具的一些慣例。
Gnuplot 是一種免費分發(fā)的繪圖工具,可以移植到各種主流平臺。它可以下列兩種模式之一進(jìn)行操作:當需要調整和修飾圖表使其正常顯示時(shí),通過(guò)在 gnuplot 提示符中發(fā)出命令,可以在交互模式下操作該工具?;蛘?,gnuplot 可以從文件中讀取命令,以批處理模式生成圖表。例如,如果您正在運行一系列的實(shí)驗,需要每次運行后都查看結果圖表;或者當您在圖表最初生成很久以后需要返回圖表修改某些內容時(shí),批處理模式能力會(huì )特別有用。當在 WYSIWIG 編輯器中很難捕獲用于修飾圖表的鼠標單擊事件時(shí),您可以很容易地將 gnuplot 命令保存在文件中,六個(gè)月后將其加載到交互式會(huì )話(huà)中重新執行。
Gnuplot 是在 1986 年由 Colin Kelley 和 Thomas Williams 最初開(kāi)發(fā)的。許多參與者都在為不同的“終端”創(chuàng )建變種方面做出了貢獻。在 1989 和 1990 年,這些變種被合并到 gnuplot 2.0 中。2004 年 4 月,發(fā)布了 4.0 版本。本教程將適用于 4.0 版本,但是這里介紹的大多數命令應該也適用于其他版本。在適當的地方,我將提及其中的主要區別。 參考資料中列出了 gnuplot 的官方 Web 站點(diǎn)。
下面,我們?yōu)槌鯇W(xué)者提供了實(shí)踐指南;但是即使您以前有一些 gnuplot 的經(jīng)驗,您也可能會(huì )在 4.0 版本中發(fā)現新的慣例和命令。我們從簡(jiǎn)單的正弦曲線(xiàn)開(kāi)始,將其定制為我們所希望看到的形狀。然后我們將研究如何繪制一組數據點(diǎn)。在本文中,我們僅限于 2D 繪圖,因為它們是最常見(jiàn)的。
|
GNG:Gnuplot 不是 GNU
雖然它的名稱(chēng)可能意味著(zhù)其他方面,但 GPL 不包含 gnuplot。對于法律方面,gnuplot FAQ #1.7 指出:“從您不必為其付錢(qián)方面來(lái)講,Gnuplot 是免費軟件。不過(guò)從您不能免費分發(fā) gnuplot 的修改版本方面來(lái)講,它又不是免費軟件。請閱讀和接受發(fā)行版中的版權文件?!?/p>
|
|
初學(xué)用戶(hù)時(shí)常能夠很好地想出他們的圖表形狀,但是不知道需要使用什么 gnuplot 命令。所以了解 gnuplot 的關(guān)鍵是很好地掌握它的詞匯表,其余應該憑足夠的直覺(jué)。在本教程中,我僅能對您將在 gnuplot 中充分使用的通用選項提供一個(gè)了解;本教程并不是毫無(wú)遺漏的。所以,例如,我告訴您如何設置 x 范圍來(lái)限制圖表中 x 軸的范圍。設置 y 范圍與 x 范圍相似(在命令中使用 yrange,而不是 xrange ),但我將不再討論。
基礎
通過(guò)在 shell 命令提示符中輸入 gnuplot 啟動(dòng) gnuplot。您首先看到提示符號 > 。該提示符是進(jìn)入 gnuplot 的輸入點(diǎn);Linux 用戶(hù)將習慣于這種方式。例如,您可以使用方向鍵來(lái)查找以前輸入的命令歷史記錄,然后編輯和重新執行這些命令;Home 和 End 鍵與平時(shí)使用沒(méi)有區別??梢詫?gnuplot 進(jìn)行重新編譯以便使用 GNU readline 庫在輸入提示符上來(lái)回移動(dòng),但類(lèi)似于默認函數。
Gnuplot 提供了廣泛的在線(xiàn)幫助,如果您要做任何有用的事情,則肯定會(huì )用到這些在線(xiàn)幫助。語(yǔ)法是統一的:通過(guò)輸入 help <command> 可以獲得任何命令的幫助。接著(zhù)啟動(dòng) gnuplot,嘗試命令 help set yrange 和 help set(在每個(gè)命令之后,使用 q 退出幫助)。注意 yrange 是 help set 下的可用子選項之一。一般來(lái)說(shuō),gnuplot 幫助為命令的所有可能定制提供進(jìn)一步的幫助。瀏覽幫助中的示例部分通常就足可以了解如何使用命令。
Gnuplot 還有大量展示其能力的演示,通常位于安裝的演示子目錄中。為了獲得這些能力,在 gnuplot 提示符下進(jìn)入此目錄中(例如, cd '/opt/gnuplot/demo' — 注意 gnuplot 要求所有文件名和目錄名都用單引號或雙引號括起來(lái)),然后輸入 load 'all.dem' 。該目錄中的各個(gè) .dem 文件演示了各個(gè)函數,all.dem 將它們一次全部加載。但您可能想將此操作延遲到本文結束時(shí)進(jìn)行,這樣我們可以開(kāi)始使用 gnuplot ,無(wú)需再進(jìn)行其他操作...
對于那些想要繼續的人,可以在提示符中分別輸入代碼清單中的每行代碼?;蛘?,將整個(gè)清單保存到一個(gè)臨時(shí)文件中,然后通過(guò)在 gnuplot 提示中輸入 load 'filename' (不要忘記引號)來(lái)運行代碼。
可以預見(jiàn)的是,2D 繪圖的命令是 plot 。在提示符中輸入 plot sin(x) :您應該在彈出窗口中看到熟悉的正弦曲線(xiàn)。
圖 1. sin(x)
我們剛剛創(chuàng )建了可能是最簡(jiǎn)單的圖。讓我們看看如何以不同方法定制該圖。假設我們只想看到一個(gè)正弦曲線(xiàn)周期。我們通過(guò)限制圖的默認 x 范圍來(lái)完成此操作。使用表示法 [min:max] 來(lái)指定范圍。要僅指定最小值,使用 [min:];要僅指定最大值,使用 [:max]。數學(xué)上稱(chēng)此為所謂的“閉”區間表示法。
這里我們使用 [-pi:pi] 得到一個(gè)正弦曲線(xiàn)周期:
清單 1. 從 -pi 到 +pi 的 sin(x)
set xrange [-pi:pi]
replot
reset
|
圖 2. 重繪正弦曲線(xiàn)圖
我們剛才使用了 replot 命令,它執行先前的 plot 命令。當您繪制曲線(xiàn)圖且需要不斷對該圖進(jìn)行修改以添加想要的特征時(shí),此命令會(huì )非常有用。另外,replot 使您可以添加更多的圖。嘗試輸入 replot cos(x)。依照語(yǔ)法,該命令等同于 plot sin(x), cos(x) 。Replot 就是獲取先前的繪圖字符串,添加必要的逗號,然后附加輸入給它的其余部分。
使用的最后一個(gè)命令 reset 對于繪制正弦曲線(xiàn)不是必要的。它移除先前所有 set 命令的效果并恢復默認值。因此,在本例中,它將使用默認 x 范圍。
現在讓我們嘗試一些更奇特的東西: plot sin(x)/x 。您應該看到如下所示圖形:
圖 3. sin(x)/x
從剛才這三個(gè)簡(jiǎn)單的例子,您可以看到 gnuplot 能夠理解 pi 并具有豐富的自帶數學(xué)函數詞匯表。它甚至知道非常有用的管理正態(tài)分布的統計函數,以及深奧的特殊函數,如朗伯、貝塞爾、beta 和 gamma 函數(還有更多?。?,這些函數通常僅在 mathematica 等功能齊全的數學(xué)工具中才會(huì )有。根據經(jīng)驗,語(yǔ)法與 C 中的語(yǔ)法相似,C 中的語(yǔ)法又與平常數學(xué)中使用的語(yǔ)法相似。(一個(gè)重要的不同是指數的表示法:為了方便,x 的 y 次冪寫(xiě)為 x**y )。
接著(zhù),將圖命名為(“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 會(huì )產(chǎn)生新的一行。一般來(lái)說(shuō),gnuplot 在雙引號內的字符串中進(jìn)行類(lèi)似于 C 的反斜杠處理。Windows 用戶(hù)注意:如果您想文件名使用雙引號括起來(lái)的字符串表示,則必須使用兩個(gè)反斜杠:如 "c:\\developerworks" (或者可以使用一個(gè)正斜杠: "c:/developerworks" )。
現在,我們注意到 x 軸實(shí)際沒(méi)有標記為度數,看起來(lái)不是很好。要修改此問(wèn)題,通過(guò)調整 x 軸上的 tic 標記,使指定的(主)標記僅以 90 度增加和輔標記以 45 度增加。主 tics 的“級別”為 0,這是默認值;輔 tics 的級別為 1。每個(gè)點(diǎn)分別由一個(gè) 3 元組指定: "label" (放在引號中)、 <point-at-which-tic-is-made> 和 <optional-level>。
清單 3. 改變軸上 tic 并設置網(wǎng)格
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、標題、網(wǎng)格和標簽的軸的 sin(x)
注意對 +45 度和 -45 度輔標記使用了空標簽 ("")。還要注意我們不必以任何順序列出點(diǎn)。像 gnuplot 中的其他所有項一樣, xtics 命令功能非常多,具有方便的選項,用于以固定增量創(chuàng )建 tic 標記(在對數標度中為正常倍數),以及用于時(shí)間相關(guān)數據的特殊格式。查看 help set xtics 中的例子可以獲得更多信息。
作為邊注,注意我們使用反斜杠將 xtics 命令擴展成多個(gè)輸入行。這樣可以使比較長(cháng)或比較復雜的命令更易讀懂。
我們還用 set grid 來(lái)設置網(wǎng)格,該命令使您可以從數量上查看圖。到現在為止,我們大量地使用了 set 命令。Gnuplot 有一種撤銷(xiāo)設置的統一方法:在 gnuplot 4.0 中,命令是 unset。例如,如果您不想要網(wǎng)格,使用 unset grid 。4.0 以前的版本,命令是 set nogrid 。
順便說(shuō)一下,我們提供的所有例子都可以在交互模式或批處理模式下運行。要以交互模式運行,在提示符中輸入每個(gè)命令。要以批處理模式運行,將命令輸入或添加到文本文件中,然后在 gnuplot 提示符中使用 load 'filename' 讀入文件,或者在 shell 提示符下將其作為參數提供給 gnuplot: $ gnuplot filename 。使用第二種方法,gnuplot 會(huì )在執行輸入文件中的所有命令后退出,所以當直接繪圖到文件中(請參見(jiàn)下一節)時(shí),采用批處理模式執行特別有效。如果在屏幕上繪圖時(shí)使用第二種方法,輸出窗口一出現(當 gnuplot 退出時(shí))就會(huì )消失,所以您需要使用顯式的“pause -1”命令(請參閱 help pause )來(lái)保持窗口。
批處理模式操作中使用的 Gnuplot 命令文件往往停留一會(huì ),從而幫助使用注釋來(lái)提高可讀性。 # 后面的直到行結束的內容是注釋。所以在示例清單 3 中,gnuplot 不處理 we want only one cycle 。
終端設備 —— 題外話(huà)
在啟動(dòng)時(shí),您可能注意到終端類(lèi)型設置為 X11。Gnuplot 采用標準設計,可以在多個(gè)終端設備上繪圖。這包括直接打印到多種打印機中,包括 Epson、HP 和 Imagen 打印機。它甚至可以在偽設備中繪圖,如 postscript 和 png。這主要涉及生成輸出文件,而不是可查看文件或打印輸出。這是將您的圖表包含在其他報表中的一種技巧。雖然我還沒(méi)有發(fā)現在 Windows 中與在 Linux 中有什么不同,本文檔建議您在設置輸出文件名之前先設置終端類(lèi)型:
清單 4. 設置輸出和終端類(lèi)型
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 中有了您剛才繪制的圖,且可以包含在一個(gè)更大的報表中。許多普遍使用的排版和制圖程序都有專(zhuān)門(mén)的終端,這些程序包括 Adobe Illustrator( set term aifm )、Corel Draw( set term corel)、AutoCad( set term dxf )和多種 LaTex 相關(guān)的終端( eepic、 latex 、 pstricks、 texdraw 、 tpic 等等)。您還可以得到 PostScript、enhanced PostScript (eps) 或 Adobe PDF 格式的文件。您的 gnuplot 版本可能沒(méi)有編譯所有的終端驅動(dòng)程序 —— 例如,Windows 用戶(hù)不需要 Xll 終端,Linux 用戶(hù)不需要 Windows 終端。類(lèi)似地,出于法律原因,gnuplot 4.0 移除了對 gif 終端的支持。
所有終端在能力上都不相同。其中的一些(如 LaTeX)可能不支持文本的旋轉,所以如果您像我們前面那樣設置 ylabel,在不同的終端中可能顯示不一樣。換句話(huà)說(shuō),您可以在 LaTeX 的特定終端中使用 LaTex 命令。例如, set ylabel "$sin(\\theta)$"(注意我們使用兩個(gè)反斜杠產(chǎn)生一個(gè) LaTex 所需的反斜杠 —— gnuplot 在將雙引號中所括的字符串傳送到終端驅動(dòng)程序之前,先對其進(jìn)行反斜杠處理)?,F在,您可以使用 \input{output.tex} 將輸出文件包含在 LaTeX 文件中。要在 PostScript 終端中獲得相同的結果,使用相應的 PostScript 命令: {/Symbol q} 。在 enhanced PostScript 和 LaTeX 中,您可以使用表示法 x^{superscript}和 x_{subscript} 得到上標文字。還要注意縮寫(xiě)的終端和輸出命令:
清單 5. eps 驅動(dòng)程序的能力
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
|
參考資料部分的代碼補充說(shuō)明包含具有以上命令的 TeX 文件示例。
鼠標支持
版本 4.0 提供了新的功能,Windows 和 X11 終端支持鼠標交互。鼠標支持有兩個(gè)主要用途:坐標跟蹤和縮放。鼠標指針的當前坐標顯示在終端窗口的左下角。通過(guò)雙擊第一個(gè)鼠標按鈕可以將其復制到剪貼板中。當您需要設置需要直接坐標的標簽或箭頭時(shí),此操作會(huì )非常有用。(使用 help arrow 和 help label 可以獲得這些命令的更多詳細信息。)還可以拖動(dòng)第二個(gè)(或右擊)鼠標按鈕來(lái)選擇要放大的矩形區域。在 3D 繪圖中,您可以拖動(dòng)鼠標來(lái)旋轉圖像(按住 Ctrl 鍵將僅更改軸的視圖;所以對于要用很長(cháng)時(shí)間才能呈現的圖,可以先更改軸,然后放開(kāi) Ctrl 鍵來(lái)重新呈現圖)。
鼠標支持還支持一組有用的熱鍵:如果先前對圖進(jìn)行了放大, u則取消訪(fǎng)大。 g切換網(wǎng)格, l切換坐標軸上的刻度; L切換最靠近指針的最標軸上的刻度, r切換標尺,標尺會(huì )建立任意原點(diǎn)。啟用了標尺后,屏幕的底部顯示當前坐標指針距離標尺原點(diǎn)的 x 軸距離和 y 軸距離以及距離實(shí)際原點(diǎn)的 x 軸和 y 軸距離(與點(diǎn)的坐標相同)。在 3D 中,方向鍵可以用在鼠標拖拉的地方來(lái)旋轉圖像??崭矜I激活命令窗口, q退出終端窗口。要查看所有選項,在支持鼠標的終端中輸入 h。
控制比例和長(cháng)寬比
默認情況下,gnuplot 對 x 軸和 y 軸都使用比例系數 1,但是它對控制圖形的長(cháng)寬比(y 軸長(cháng)度與 x 軸長(cháng)度的比率)不起作用。終端驅動(dòng)程序使用終端的默認長(cháng)寬比。比例系數、長(cháng)寬比或者兩者都可以使用 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 使用給定的長(cháng)寬比能否成功繪制圖可能受到終端能力的限制。 set size 也是與 multiplot 命令一起使用才有用,multiplot 命令用于在同一輸出屏幕或文件中生成多個(gè)圖。
繪制多條曲線(xiàn)
正如精明的讀者可能已經(jīng)從上面關(guān)于 replot 的注釋中推測到的,gnuplot 使您可以同時(shí)畫(huà)多條線(xiàn)。假設我們同時(shí)繪制正弦和余弦曲線(xiàn)。簡(jiǎn)單的 plot 命令為 plot sin(x), cos(x);要畫(huà)的曲線(xiàn)以逗號分隔。如果不再指定其他項,gnuplot 自動(dòng)顯示兩個(gè)曲線(xiàn)圖,從而它們可以互相區別 —— 在諸如 Windows 和 Xll 的終端中,gnuplot 使用不同的顏色。單色終端使用不同種類(lèi)的線(xiàn)顯示曲線(xiàn)圖。通過(guò)查看圖例(或鍵),您應該能夠知道圖中的線(xiàn)分別是何種曲線(xiàn)。gnuplot 還允許您指定繪圖的樣式,以便獲得進(jìn)一步的控制:
unset xtics # keep all other things simple plot sin(x) with linespoints pointtype 5, cos(x) w boxes lt 4 圖 5. 多條曲線(xiàn)
with 子句(請參閱 help plot with ,如果使用版本 4.0,還有 help plotting styles )使您可以詳細而精確地指定線(xiàn)的樣式。在本例中,我們說(shuō)明兩種有用的樣式。第一種樣式 linespoints 通常在對數據繪圖時(shí)非常有用,它在涉及的每個(gè)示例或數據點(diǎn)處標記一個(gè)點(diǎn),并使用線(xiàn)性插值法連接連續的點(diǎn)。這里我們另外指定點(diǎn)類(lèi)型為 5,它選擇終端允許的第五種點(diǎn)。第二種樣式 boxes 更適合繪制直方圖數據。注意我們如何在 cos(x) 曲線(xiàn)中將 with 縮寫(xiě)成 w 。類(lèi)似地, lt是 linetype 的縮寫(xiě),是另一個(gè)特定于終端的設置,它選擇終端可以繪制的四種線(xiàn)。不必說(shuō)(什么,您還沒(méi)有嘗試 help plot with嗎?),您可以使用 pt 代替冗長(cháng)的 pointtype。如果想在多條線(xiàn)中使用相同的繪圖樣式(在一個(gè) plot 命令中或在多個(gè) plot 命令中),可以使用 set 命令設置繪圖樣式。在 gnuplot 4.0 中,使用 set style function linespoints ;以前的版本使用語(yǔ)法 set function style boxes。要更改用于繪制與函數相對的數據集合的樣式,使用 set style data linespoints(以前的版本使用 set data style linespoints )。
|
gnuplot 如何工作
除了趣味性,本次練習顯示了 gnuplot 實(shí)際如何對函數繪圖 —— 它獲取多個(gè)樣本并在每個(gè)樣本點(diǎn)繪制值。通常,它會(huì )在這些點(diǎn)間平滑地插入值;使用 boxes 樣式則強制它使用平面的直方圖,linespoints 樣式用一個(gè)點(diǎn)標記每個(gè)樣本。要更清楚地觀(guān)看,顯式地將采樣比率設為 10( set samples 10 )并重新繪圖。(然后將其設置會(huì )默認值 100)。
|
|
with 子句是我們使用除了 set 之外的其他項來(lái)定制圖的第一個(gè)例子。一些其他普遍使用的選項也可以直接在 plot 命令中設置。例如,還可以設置 xrange: plot [-pi:pi] sin(x)。對默認繪圖選項的快速而隨意的一次性更改則使用此類(lèi)語(yǔ)法。要在多個(gè)圖中或在多個(gè) plot 命令中重新使用,需要使用 set 命令。
當繪制兩條或多條曲線(xiàn)時(shí),我們需要關(guān)鍵字或圖例來(lái)對它們進(jìn)行區分。默認情況下,關(guān)鍵字在右上角;但是如果它妨礙了圖,可以將關(guān)鍵字放到其他位置 —— 如果愿意,甚至可以放到圖外。下面的代碼片段將關(guān)鍵字放在了左上角,并在它周?chē)O置了一個(gè)框。我們還通過(guò)在 plot 命令中給定明確的標題來(lái)控制圖例中為曲線(xiàn)提供的名稱(chēng)。title 可以縮寫(xiě)為 t,正如我們對余弦曲線(xiàn)的設置。如果不想在圖例中命名曲線(xiàn),使用 notitle ,而不是 title 。最后一點(diǎn),也是新用戶(hù)經(jīng)常出錯的地方就是如果有標題,標題必須放在 with 子句的前面:
清單 6. 定制圖的關(guān)鍵字或圖例
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. 定制關(guān)鍵字
在同一屏幕上繪制相關(guān)的圖
上面,我們在同一圖中繪制了正弦和余弦曲線(xiàn)。Gnuplot 使您還可以繪制多個(gè)圖,這樣它們可以并排顯示在同一輸出屏幕或文件中。在某些排版系統中,以一個(gè)文件的形式包含兩個(gè)圖形比分別包含兩個(gè)圖形要更容易。
下面是簡(jiǎn)單說(shuō)明的 multiplot ,它繪制正弦、余弦及其各自倒數的曲線(xiàn)圖?;痉椒ㄊ菍⑵聊换驁D像文件的邊框比例設為 1。然后,我們繪制不同的曲線(xiàn)圖,從而它們可以每個(gè)圖占據屏幕的四分之一。我們還通過(guò)使用屏幕坐標(請參閱 help coordinates ,獲得關(guān)于不同類(lèi)型坐標系統的討論)設置原點(diǎn)來(lái)控制曲線(xiàn)圖顯示的位置。另外,注意每個(gè) plot 還自動(dòng)計算軸、tic 等等的寬度 —— 這樣您可能必須調整邊距寬度以使不同繪圖的軸排成一行。在本例中,我必須將左邊距設置為 6 個(gè)字符寬度,以便調整 cosec(x) = 1/sin(x) 的科學(xué)記數法中的 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 繪圖
繪制數據圖
雖然本教程只是出于說(shuō)明目的,大部分內容都集中于繪制正弦曲線(xiàn),您很可能很想對試驗數據、銷(xiāo)售數據或其他類(lèi)似數據繪圖。在這一節,我們將使用 IBM 的股票價(jià)格作為數據集合說(shuō)明如何繪制不同的圖(本例的原始數據包含在 參考資料部分中):
表 1. IBM 股票價(jià)格
| 日期 |
開(kāi)盤(pán) |
最高 |
最低 |
收盤(pán) |
| 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 |
大多數數據集合都是數字列,但是這個(gè)數據集合有所不同,因為 x 軸是時(shí)間數據。下列代碼告訴 gnuplot 如何讀取和格式化 x 軸上的時(shí)間數據(有關(guān)詳細信息,請參閱 help time/data 和 help set timefmt ):
清單 8. 設置時(shí)序數據
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
|
一旦設置完成,可以使用下列命令對開(kāi)盤(pán)價(jià)繪圖。我們選擇在不同的開(kāi)盤(pán)價(jià)之間使用直線(xiàn)插值法,并使用 linespoints樣式,而不只是 points:
plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2 with linespoints
圖 8. 繪制開(kāi)盤(pán)價(jià)圖
象往常一樣,["31-May-04":"11-Jun-04"] 顯式設置了 xrange,但不是完全必要的。注意范圍的 min 和 max 需要指定為符合 timefmt 的字符串。
取決于使用的繪圖樣式,gnuplot 在繪制一個(gè)點(diǎn)時(shí)最多可以使用六個(gè)不同的編號。當讀入記錄時(shí),列從 1 開(kāi)始編號。 using 1:2 告訴 plot 命令使用第一列作為 x 軸,第二列作為 y 軸。所以要繪制收盤(pán)價(jià)圖,我們將使用 using 1:5 。
每次 gnuplot 看到新的數據分隔符時(shí),列編號就會(huì )增加。默認情況下,數據分隔符為空格。所以如果時(shí)間格式中間有空格(例如 10 Jun 04 ,而不是 10-Jun-04 ),我們將需要使用 using 1:4 代替 1:2 。對于 x 軸,我們僅需要指定數據開(kāi)始的第一列。Gnuplot 能夠智能地使用 timefmt 字符串讀取其他列。
using 使您可以添加兩個(gè)以上的冒號,用于指定特定繪圖樣式可能需要的任何其他列。您還可以使用 $n 表示第 n 列,從而對二進(jìn)制表達式進(jìn)行繪圖。在一個(gè)完全虛構的示例中,我們假設不同的價(jià)格表示不同的試驗運行,我們要繪制平均價(jià)、最高價(jià)和最低價(jià)。 yerrorbars 樣式使您可以繪制 y-high/y-low 值(我們在 using修飾符中指定為 x:y:ylow:yhigh)以及計算 y 軸四個(gè)價(jià)格的平均值為 ($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. 計算平均值
errorlines 樣式是相似的,但它還在繪制的 y 軸點(diǎn)之間繪制線(xiàn)段。對于繪制財務(wù)條形圖,Gnuplot 還有單獨的樣式,分別是最高價(jià)、最低價(jià)和 tics 在左邊,右邊為開(kāi)盤(pán)價(jià)和收盤(pán)價(jià)。我們使用 set bars 顯示開(kāi)盤(pán)價(jià)和收盤(pán)價(jià)的較大 tics):
set bars 5 plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2:3:4:5 with financebars
圖 10. 繪制財務(wù)條形圖
您還可以查看 help plotting styles 獲得其他相關(guān)樣式,如 candlesticks、boxerrorbars 和錯誤繪圖樣式。
處理真實(shí)數據集合
當然,對于真實(shí)的數據集合,事情可能會(huì )變得更復雜。最常見(jiàn)的就是數據集合不使用空格字符分隔數據點(diǎn)。gnuplot 4.0 提供了新的功能,您可以使用 set datafile separator <string> 指定自己的分隔符。同樣地,您還可以使用 set datafile commentschar 指定除了 # 之外的注釋字符。如果需要更多的控制,您可以為 using 修飾符明確指定格式字符串。Gnuplot 使用 C 標準庫的 scanf 函數以及給定格式字符串(有關(guān)詳細信息,請參閱 help using )讀入數據。我講述此方法僅是為了內容更全面;能夠以此方法讀入的數據集合也可以使用 set data file separator 進(jìn)行處理,或者通過(guò)顯式指定 using 修飾符中要使用的列編號來(lái)進(jìn)行處理。例如,如果需要忽略第一列中的字符串,則使用 2:3 進(jìn)行繪圖。為了獲得更完全的靈活性,在具有 popen 函數的 Unix 類(lèi)系統中,在將文件傳送給 plot 命令之前,可以使用文本處理實(shí)用程序對文件進(jìn)行預處理。例如: plot "< awk --f preprocess.awk data.file" 。不幸的是,該命令不能在所有系統中使用。最后的一個(gè)方法是在 gnuplot 中使用輸入文件之前對其進(jìn)行預處理。
有時(shí),真實(shí)的數據可能沒(méi)有包含所有的點(diǎn) —— 對于要繪圖的列,可能有 x 值,但缺少相應的 y 值。Gnuplot 允許您指定字符串,用于表示缺少的數據點(diǎn)。例如:
set datafile missing 'NaN' # The IEEE floating point not-a-number
注意,在 4.0 版本之前,命令是 set missing <string> 。
不幸的是,處理缺少數據的數據點(diǎn)的方法取決于 using 說(shuō)明。如果想了解用法 plot 'file' 、 plot 'file' using 1:2 和 plot 'file' using ($1):($2)之間區別的詳細信息,請參閱 help using。但是為了安全起見(jiàn),通常指定列使用顯式的 using 格式,如果您想完全清除不合適的數據點(diǎn),不要使用表達式求值(第三個(gè)選項會(huì )因為括號而對表達式求值)—— 而是,預處理數據文件并用計算的表達式的結果添加確切的列。
往常,您可能以一些無(wú)效的數據點(diǎn)而結束。如果 gnuplot 被告知忽略無(wú)效數據點(diǎn),您仍可以對這樣的數據集合繪圖。Gnuplot 忽略未定義的點(diǎn),這樣當您遇到不合適的點(diǎn)時(shí),技巧就是使用未定義的 y 值,如1/0。類(lèi)似于 C 的三元算符可以很容易地表達此信息(如果您不熟悉此函數,請參閱 help ternary ;在定義分段函數時(shí)它也非常有用)。下面是 help using 中介紹的一個(gè)例子,它使您以第二列作為 y 值來(lái)繪圖,除非第三列大于 10:
plot 'file' using 1:($3>10 ? $2 : 1/0)
高級例子
雖然本文向您展示了會(huì )經(jīng)常使用的大多數命令,但可能有些地方您還需要進(jìn)一步地研究。在這一節,我們簡(jiǎn)要討論其中一些概念,然后提供了其中一個(gè) gnuplot 演示文件(electron.dem)中的腳本,該腳本繪制電子學(xué)中常見(jiàn)的幅頻響應圖,用以說(shuō)明它們的用法。
- 用戶(hù)定義的函數和變量
您可以任意定義自己的復雜函數,如下面的 A(jw)。這些函數可以用參數 (p1, p2) 表示,您可以稍后在 plot 命令中使用它們之前再定義參數變量。
- 復數
Gnuplot 可以識別復數。{a,b} 表示復數 a+bi。您可以使用函數 abs() 和 arg() 獲得絕對值和輻角。
- 虛變量
當在 plot 命令中使用 sin(x) 時(shí),gnuplot 將 x 用作虛變量,并對它賦不同的值以獲得示例。當編寫(xiě)復雜的用戶(hù)定義的函數時(shí),您可以使用函數定義中使用的傳統變量名稱(chēng),也可以顯式設置要使用的虛變量的名稱(chēng)(例如, set dummy jw )。
- x2 和 y2 軸
除了常見(jiàn)的沿著(zhù)曲線(xiàn)圖底部和左邊的 x 軸和 y 軸之外,還可以使用曲線(xiàn)圖的頂部(x2)和右端(y2)作為單獨的軸。這些軸都相互獨立,可以單獨設置范圍、tics、標簽和比例(例如對數刻度)。而且,通過(guò)使用 axes 子句, plot 命令可以使用不同的軸集合,如 x2y2。默認情況下, plot 命令以 x 軸和 y 軸繪圖。當您需要同時(shí)繪制范圍為不同量級或具有不同單位的線(xiàn)時(shí),此高級功能非常有幫助。在下面的示例中,y 軸繪制振幅,最大值為 1,y2 軸繪制相位,最大值為 100。如果對軸的相同集合繪圖,振幅曲線(xiàn)幾乎看不出來(lái)。
- 對數刻度
您可以使用 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. 振幅和相位頻率響應
結束語(yǔ)
在本文中,我們討論了使用新發(fā)布的 gnuplot 4.0 繪制 2D 圖形的復雜性。雖然我們接觸了大多數的關(guān)于使用 gunplot 的重要方面,但限于篇幅有限,我們仍有少數主題沒(méi)有討論。值得注意的一些省略范圍包括從非常簡(jiǎn)單的參數函數繪圖(請參見(jiàn) help parametric )、極坐標( help polar ),到曲線(xiàn)擬合(它使用戶(hù)定義曲線(xiàn)與給定數據集合相匹配)。曲線(xiàn)擬合是一門(mén)藝術(shù),需要用一整篇文章來(lái)講述,但是請參閱 help fit 和 beginners_guide and tips 來(lái)對它獲得初步了解。
常用技巧
正如我們所看到的,gnuplot 是高度可定制的。我將以這個(gè)最后的技巧來(lái)結束本文,它說(shuō)明如何在多個(gè) gnuplot 會(huì )話(huà)中重用您的定制。定制的主要命令是 set 命令。您可以使用 save set 'filename' 保存當前會(huì )話(huà)的所有設置。 save var <file> 和 save func <file> 分別保存用戶(hù)定義的變量和函數。但是無(wú)法保存傳送到單一 plot 命令的定制(例如, plot [-pi:pi] sin(x) 中的 x 范圍)。這些文件可以使用 load <file> 讀回。Gnuplot 還在開(kāi)始時(shí)查找名為 .gnuplot 的文件。它首先在當前目錄中查找,然后在用戶(hù)的主目錄中查找(Windows 中的 USERPROFILE 目錄)。如果找到初始化文件,gnuplot 會(huì )執行其中的命令。一些用戶(hù)將此方法用于設置終端類(lèi)型和定義經(jīng)常使用的函數或變量。
|