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