国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
gnuplot 讓您的數(shù)據(jù)可視化

級別: 初級

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 yrangehelp set(在每個命令之后,使用 q 退出幫助)。注意 yrangehelp 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 arrowhelp 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/datahelp 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,但不是完全必要的。注意范圍的 minmax 需要指定為符合 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:2plot '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)圖,用以說明它們的用法。

  1. 用戶定義的函數(shù)和變量
    您可以任意定義自己的復(fù)雜函數(shù),如下面的 A(jw)。這些函數(shù)可以用參數(shù) (p1, p2) 表示,您可以稍后在 plot 命令中使用它們之前再定義參數(shù)變量。
  2. 復(fù)數(shù)
    Gnuplot 可以識別復(fù)數(shù)。{a,b} 表示復(fù)數(shù) a+bi。您可以使用函數(shù) abs() 和 arg() 獲得絕對值和輻角。
  3. 虛變量
    當在 plot 命令中使用 sin(x) 時,gnuplot 將 x 用作虛變量,并對它賦不同的值以獲得示例。當編寫復(fù)雜的用戶定義的函數(shù)時,您可以使用函數(shù)定義中使用的傳統(tǒng)變量名稱,也可以顯式設(shè)置要使用的虛變量的名稱(例如, set dummy jw )。
  4. x2 和 y2 軸
    除了常見的沿著曲線圖底部和左邊的 x 軸和 y 軸之外,還可以使用曲線圖的頂部(x2)和右端(y2)作為單獨的軸。這些軸都相互獨立,可以單獨設(shè)置范圍、tics、標簽和比例(例如對數(shù)刻度)。而且,通過使用 axes 子句, plot 命令可以使用不同的軸集合,如 x2y2。默認情況下, plot 命令以 x 軸和 y 軸繪圖。當您需要同時繪制范圍為不同量級或具有不同單位的線時,此高級功能非常有幫助。在下面的示例中,y 軸繪制振幅,最大值為 1,y2 軸繪制相位,最大值為 100。如果對軸的相同集合繪圖,振幅曲線幾乎看不出來。
  5. 對數(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 fitbeginners_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ù)或變量。


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Gnuplot 常用繪圖功能簡單介紹
Gnuplot|00 簡介
Gnuplot (一)運行/數(shù)學(xué)表達式/簡單函數(shù)繪圖
matlab畫圖命令積累
gunplot(2)
MATLAB函數(shù)畫圖
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服