- 論壇徽章:
- 0
|
翻譯老外的文章,原作者
ishanth Sastry
gnuplot
用gnuplot4.0可以將你的數(shù)據(jù)和函數(shù)變成看上去專業(yè)的圖片。gnuplot是一個自由分發(fā)的繪圖軟件。本文給出一個方便的gnuplot指南,重點是一些術(shù)語,能幫助你高效地使用這個工具。
gnuplot是一個自由分發(fā)的繪圖工具,已經(jīng)被移植到幾乎所有的主要系統(tǒng)上。它有兩種工作模式:當(dāng)你需要調(diào)整
和美化一幅圖使之正確,你可以用交互模式操作它,也就是在gnuplot提示符后輸入命令。另外,gnuplot可以從文件中讀取命令,以批處理的方式產(chǎn)
生圖片。例如,如果你要做一系列的實驗,并且需要在每次實驗后觀察實驗結(jié)果的圖片;或者,當(dāng)你修改一張你很久以前做的圖片的某一部分時,批處理模式就特別
有用。因為,你在所見即所得編輯器里美化圖片時捕捉鼠標(biāo)點擊很困難,但你可以很容易地把gnuplot命令存入一個文件,并在6個月后在交互方式下重新執(zhí)
行。
gnuplot最早由Colin Kelley 和Thomas
Williams開發(fā)于1986年。一些貢獻者為其添加了不同的“終端”支持產(chǎn)生不同的變種。在1989到1990年間,這些被融入
gnuplot2.0。2004年4月,4.0版發(fā)布。這個教程是用于4.0版的,但這里介紹的大部分命令也可以用于其它版本?赡艿那闆r下,我會提到那
些主要的區(qū)別。gnuplot的官網(wǎng)列在資源里。
下面,我們給新手一個方便的教程;但即使你有g(shù)nuplot使用經(jīng)驗,你也可能會發(fā)現(xiàn)出現(xiàn)的4.0版的新術(shù)語和新命令。我
們從一個簡單的sin函數(shù)曲線開始并且按照我們的需要進行定制。接著我們將學(xué)習(xí)如何畫一系列的數(shù)據(jù)點。本文,我們只討論2D繪圖,因為這是最一般的情況。
GNG:gnuplot不是GNU
雖然名字有所暗示,gnuplot不使用GPL。對于法律上的好奇,gnuplot的FAQ
#1.7說:“gnuplot是在你免費使用意義上的自由軟件。但你不能自由發(fā)行你自己修改的版本。請閱讀并接受你那版的版權(quán)文件。
經(jīng)常,新手用戶可能對他們圖片可能的外觀有很好的想法,但明顯不是他們需要使用的gnuplot命令。
所以理解gnuplot的關(guān)鍵是很好掌握它的單詞表,并且能本能地使用它們。這個教程里,我只能提供給你最終使用gnuplot的一般選項的感覺;這絕對
不是徹底的。所以,例如,我告訴你如何設(shè)置x-range來限制圖片x軸的范圍,設(shè)置y-range也是類似(使用yrange來代替命令中的
xrange),但我不會再說。
基礎(chǔ)
在你的命令提示符后輸入gnuplot來打開gnuplot。首先你看到的是提示符>。這個提示符是
gnuplot的輸入點;linux用戶對此應(yīng)該很習(xí)慣。例如,你可以用方向鍵瀏覽你以前輸入命令的歷史記錄,接著可以編輯和重新執(zhí)行它們,而且,
Home鍵和End鍵功能如你所想。gnuplot可以在編譯時使用GNU readline庫,使輸入順序可以變化,但基本功能類似。
如果你想要做些有價值的事情,你就不可避免要使用gnuplot所帶的在線幫助。語法是統(tǒng)一的:任何命令的幫助
信息都可以通過鍵入help 來得到。來吧,運行g(shù)nuplot,并且馬上試一下命令help set
yrange和help
set。一般,gnuplot幫助會提供命令所有可能定制的進一步的幫助信息?匆幌聨椭械睦硬糠謺䦟Ω美斫馊绾问褂靡粋命令有所幫助。
gnuplot還帶有一大堆演示來顯示它的功能,一般放在安裝目錄的demo文件夾中。要得到這些絕技,在gnuplot提示符下轉(zhuǎn)入這個目錄(例如,cd ‘/opt/gnuplot/demo’
– 注意gnuplot要求所有文件和目錄名用單引號或雙引號括起來),并且輸入load ‘a(chǎn)ll.dem’。這個目錄每個.dem文件演示一個功能,而all.dem一次性加載所有文件。你可能想看完本文后再做這個練習(xí),這樣我們的教程不會在更忙亂中開始。
如果想跟著做的話,你可以在提示符下將那些代碼一行行輸入。另外,可以把代碼存入一個臨時文件中,并在提示符下輸入load ‘filename’來運行它(別忘記引號)。
如你所想,2D繪圖命令是plot。輸入plot sin(x):你就可以看到一個彈出窗口中熟悉的sine曲線。
圖1。sin(x)
![]()
我們剛做了可能是最簡單的圖。讓我們看看如何用不同的方法定制它,F(xiàn)在我們只想要看sine曲線的一個周期。我
們限制此圖的x-range來做到這一點。范圍是用記號[最小值:最大值]來表示的。若只確定最小值,就用[最小值:];若只確定最大值,就用[:最大
值]。數(shù)學(xué)家稱這個記號叫閉區(qū)間。
這里,我們用[-pi:pi]得到一個正弦曲線周期:
代碼1.sin(x)從-pi到pi
set xrange
[-pi:pi]
replot
reset
圖2.重畫的sine曲線圖
![]()
我們剛才使用了replot命令,它執(zhí)行前一個繪圖命令。這個命令很有用,當(dāng)你剛調(diào)整了一個圖片并且需要繼續(xù)調(diào)整,加入需要的特性時,就用它。另外,replot讓你加入更多的圖。試一下輸入replot
cos(x)。句法上,這相當(dāng)于plot
sin(x), cos(x)。replot只是簡單地把之前的繪圖語句,加上一個逗號,再加上余下的輸入部分。
最后一個使用的命令是reset,嚴(yán)格說來,對畫sine曲線是不必要的。它清除之前所有set命令的效果,恢復(fù)成缺省值。這樣,在這個例子里,它使用缺省的x-range。
現(xiàn)在,我們試一下更有趣的東西:plot sin(x)/x。你會看見下面的圖:
![]()
就從這三個例子里,可以看出,gnuplot理解pi并且有豐富自然的數(shù)學(xué)功能詞匯表。它甚至知道有用的統(tǒng)計函
數(shù)正態(tài)分布和深奧的特殊函數(shù)如lambert, bessel, beta 和
gamma函數(shù)(還有更多!)。這些一般只有一些成熟的數(shù)學(xué)工具如mathematica里才有。經(jīng)驗上,它的語法與C語言的語法類似,也就是說與日常數(shù)
學(xué)的語法類似。(一個重要的例外是冪表達式:x的y次方,習(xí)慣地寫成x**y)。
接下來,我們給圖加個標(biāo)題(”My First Graph”),坐標(biāo)軸也一樣(x軸是”angle, in
degrees”,y軸是”sin(angle)”)。
代碼2.給圖和坐標(biāo)軸加標(biāo)題set title “My
first graph”
set xlabel “angle,
\n in degrees”
set ylabel “sin(angle)”
plot sin(x)
注意,xlabel設(shè)置串里的\n產(chǎn)生一個換行。一般,gnuplot對雙引號字串里的反斜線進行類似C語言的
處理。windows的用戶需要知道:如果你打算用雙引號括住文件名,必須使用雙反斜線:例如”c:\\developerworks”(或者,你可以使
用正斜線:”c:/developerworks”)。
現(xiàn)在,我們注意到x軸不是用度來標(biāo)記的并且看上去不怎么樣。我們把這些改掉,調(diào)整x軸上的標(biāo)記,只在90度增幅
點上標(biāo)記數(shù)字,在45度增幅點上做標(biāo)記。主要標(biāo)記是0級別,這是缺省的;次要標(biāo)記的級別是1。每個標(biāo)記點分別由一個3-元組定義:”label”(用引號
括起來),,和。
代碼3.替換坐標(biāo)軸標(biāo)記并且設(shè)置網(wǎng)格 set xrange
[-pi:pi] #我們只要一個周期 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 degress” set ylabel “sin(angle)”
plot sin(x)
圖4.帶標(biāo)記,標(biāo)題,網(wǎng)格和坐標(biāo)軸名的sin(x)
![]()
注意,在+/-45度的次要標(biāo)記處使用了空標(biāo)題(””)。還可以看出,我們不需要以任何順序列出標(biāo)記點。象
gnuplot中的其它命令,xtics很功能很多,并且可以方便地在規(guī)則遞增點上建立標(biāo)記(在對數(shù)坐標(biāo)上的多種規(guī)則),和為時間相關(guān)數(shù)據(jù)準(zhǔn)備的特別格
式。更多的內(nèi)容參考help set xtics中的例子。
另外,請注意我們用反斜線來把xtics命令擴展到多行輸入。這可以讓長而復(fù)雜的命令容易閱讀。
我們還用set
grid開啟了網(wǎng)格,這方便你觀察圖形數(shù)據(jù)。前面我們一直在使用set命令。gnuplot有統(tǒng)一的方法取消設(shè)置:在gnuplot4.0里,這個命令是
unset。例如,如果你不喜歡網(wǎng)格,就用unset grid。4.0版以前這個命令一直是set nogrid。
順便說一下,我們給的所有例子都可以在交互模式或批處理模式下運行。交互模式下,在提示符后輸入每行命令就可以
運行了。批處理模式下,要把命令輸入到文本文件中,并且,或者是在gnuplot提示符后使用load
‘filename’讀入它,或者是在shell提示符后當(dāng)作參數(shù)傳給gnuplot:$gnuplot
filename。用第二種方法,gnuplot在執(zhí)行完輸入文件中的所有命令后就會退出,所以在把圖形直接繪入文件的情況下,這種批處理方法效率最高
(見下一節(jié))。如果第二種方法用在向屏幕繪圖中,輸出窗口會在繪圖一結(jié)束就消失(當(dāng)gnuplot退出時),所以,你需要使用明確的pause
–l命令(見help pause)留住窗口。
批處理方式下,gnuplot命令文件會保留一段時間,所以使用注釋對增加可讀性很有幫助。任何從#到行末間的東西都是注釋。所以在代碼3里,gnuplot不會處理“我們只要一個周期”。
終端--一個分枝
一開始,你可能注意到終端類型設(shè)置成X11。gnuplot是模塊化設(shè)計并且可以在幾種終端設(shè)備上繪圖。這包括
直接打印到幾種打印機上,包括Epson,HP 和
Imagen打印機。它甚至能打印到偽設(shè)備如postscript和png上。基本上這只產(chǎn)生一個輸出文件而不是一個可看的文件或打印輸出。這是個把你的
圖放入其它報告中的竅門。雖然我沒有注意到windows和linux上有任何不同,文檔建議,你最好在設(shè)置輸出文件名前設(shè)置好終端類型。
代碼4.設(shè)置輸出和終端類型
set terminal
png #gnuplot建議設(shè)置輸出文件名前設(shè)置好終端類型
set output ‘output.png’
replot
現(xiàn)在,output.png里是你剛畫的圖,可以放入一個更大的報告里了。還有些為一些流行的類型設(shè)置和繪圖程序準(zhǔn)
備的特殊終端,包括Adobe Illustrator(set term aifm),Corel Draw(set term corel),
AutoCad(set term dxf), 和 幾種 LaTex相關(guān)的終端(eepic,
latex, pstricks, texdraw,
tpic,等等)。你也可以在PostScript里得到這個文件,用加強的PostScript(eps)或Adobe
的PDF格式。你的gnuplot版本可能沒有把所有的終端驅(qū)動一起編譯進去----例如,windows用戶不需要X11終端,而Linux用戶不需要
windows終端。類似的,由于法律原因,gnuplot4.0刪去了對gif的支持。
所有終端的能力是不同的。一些象LaTeX的不支持文字旋轉(zhuǎn),所以,如果你設(shè)置了ylabel,象我們之前所做
的那樣,在不同的終端上看到的結(jié)果是不同的。別一方面,你可以在確定LaTeX終端的情況下使用LaTeX命令。例如,set ylabel
“$sin(\\theta)$” (注意,我們用了雙反斜線來產(chǎn)生LaTeX所需要的單反斜線 ----
gnuplot在做了雙引號內(nèi)反斜線處理后才把字串傳送給終端驅(qū)動),F(xiàn)在,你可以把你的輸出文件使用\input{output.tex}放入你的
LaTeX文件。同樣,在PostScript終端里,使用對應(yīng)的PostScript命令:{/Symbol
q}。對加強的PostScript和LaTeX來說,你都可以用標(biāo)記x^{superscript}和x_{subscript}做上標(biāo)。還要注意縮寫
的終端和輸出命令:
代碼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 下面資源一節(jié)里給的代碼里有一個例子TeX文件演示了上面命令的效果。
鼠標(biāo)支持
到4.0版本,Windows和X11終端都支持鼠標(biāo)交互。鼠標(biāo)支持有兩個作用:坐標(biāo)跟蹤和縮放。鼠標(biāo)的當(dāng)前坐
標(biāo)顯示在終端窗口的左下角。它可以用雙擊鼠標(biāo)第一鍵復(fù)制到剪貼板上,當(dāng)你需要放置一個標(biāo)簽或者帶有明確坐標(biāo)的箭頭時,這個用處就大了。(使用help
arrow和help
label查看這些命令的更多細(xì)節(jié)。)你也可以用鼠標(biāo)第二鍵拖動(或右擊)選擇一個矩形區(qū)進行放大。在3D繪圖里,你可以拖動鼠標(biāo)來旋轉(zhuǎn)圖像(按住控制僅
改變軸的視圖;所以,因為圖形需要很長時間渲染,你可以先改變軸,然后再放開控制鍵來重新渲染圖形)。
鼠標(biāo)支持也激活了很多有用的熱鍵:如果你之前放大過圖形,用u取消放大圖形;g激活網(wǎng)格,l激活兩個軸的對數(shù)坐
標(biāo);L激活最接近指針的軸的對數(shù)坐標(biāo);r激活標(biāo)尺,可以當(dāng)做近似的原點。當(dāng)標(biāo)尺激活后,窗口底部顯示當(dāng)前鼠標(biāo)指針位置到標(biāo)尺原點及標(biāo)尺原點到原始原點--
--即坐標(biāo)原點----的x和y向上的距離。在3D圖里,方向鍵可以用在鼠標(biāo)拖動圖形旋轉(zhuǎn)的場合;空格鍵跳回命令窗口,而q則關(guān)閉終端窗口。在鼠標(biāo)有效的
終端窗口里按h可以查看所有的選項。
控制比例和比率
缺省時,gnuplot在x和y軸上都用比例1,但沒有去控制圖形比率(y軸長度對x軸長度的比)。終端驅(qū)動使用缺省的終端比率。比例系數(shù)和比率都可以用set size命令來設(shè)置,如:
# 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命令,它用來在同一個輸出屏幕或文件中產(chǎn)生多個圖形。
畫多個曲線
聰明的讀者可能已經(jīng)從前面對replot的注釋中猜到,gnuplot可以為你同時畫多個曲線,F(xiàn)在我們同時畫正弦
余弦曲線。簡單的繪圖命令是plot
sin(x),
cos(x);要畫的圖形用逗號分開。如果你沒有設(shè)定其它東西,gnuplot自動使用兩種顏色畫出兩個圖形把他們互相區(qū)分開----在象windows
和X11的終端里。單色終端用不同的線型顯示圖形。你可以從圖例asd中看出圖形中的哪條曲線是哪條。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)定義眼花繚亂的細(xì)節(jié),確定你希望的曲線的外觀。在這個例子里,我們顯示兩個有用的風(fēng)格。第一個風(fēng)格,linespoints,一般在畫數(shù)據(jù)
圖時使用。它在每個樣本或數(shù)據(jù)點上標(biāo)記一個點,并用線性插補的方法連接相鄰的點,F(xiàn)在,我們添加定義點的類型為5,即選擇終端功能里的第五種點。第二個風(fēng)
格,boxes,更適合畫柱狀數(shù)據(jù)圖。注意我們是如何在cos(x)曲線里縮寫with as
w。類似的,它是線型的縮寫,并且是另外一種終端定義設(shè)置,選擇終端能繪制的第四種線型。無需多說(什么?你還沒試試help plot
with?),你可以用pt代替冗長的點類型。如果你打算用同樣的繪圖風(fēng)格繪制幾條曲線(或者在一條繪圖命令里,或者在幾條命令里),你可以用一條set
命令設(shè)置繪圖風(fēng)格。在gnuplot4.0里,使用set style function linespoints;之前的版本使用語法 set
function style boxes。改變數(shù)據(jù)圖而不是函數(shù)圖風(fēng)格,就使用set style data
linespoints(之前的版本用set
data style linespoints)。
gnuplot是如何做到的
作為一個有趣的方面,這個練習(xí)揭示了gnuplot實際上是如何畫函數(shù)圖----它對函數(shù)采樣并在每個采樣點上畫出樣本。一般,
它在這些點之間平滑插值;但使用boxes風(fēng)格強制它使用柱狀圖,linespoints風(fēng)格會在每個采樣點上標(biāo)記一個點。把采樣率設(shè)為10(set
samples 10)并重繪,就可以更清楚看到這一點。(事后把采樣率設(shè)回為缺省的100)
with短語是我們用的第一個set之外的來定制圖形的例子。其它一些常用的選項也可以直接在繪圖命令
中設(shè)置。例如,你也可以用plot [-pi:pi]
sin(x)設(shè)置xrange。使用這類語法可以快餐式單次性改變?nèi)笔±L圖選項。要多圖繪制或多繪圖命令中重復(fù)使用,就應(yīng)該用set命令。
當(dāng)畫兩條或更多曲線時,我們需要圖例asd來區(qū)分它們。缺省情況下,圖例在右上角,但如果它干擾了你的圖形,你
可以把它放在別的地方----如果你愿意,甚至可以在圖外。下面的代碼片斷把圖例放在左上角,并用一個框圍住。我們還修改了圖例中的曲線名,在繪圖命令中
定義了名字。命令中的title可以縮寫為t,象我們在畫余弦曲線中所做的一樣。如果你不想在圖例中命名曲線,使用notitle代替title。最后一
點,經(jīng)常折磨新手的一個問題,就是如果有名字的話,一定要放在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.定制圖例
![]()
在同一屏幕上畫相關(guān)的圖形
上面,我們在同一圖形里畫正弦和余弦曲線。gnuplot也允許你在同一輸出屏幕或文件里畫多個并列的圖。在一些排版系統(tǒng)里,引用一個文件里的多圖比分別引用它們要容易。
現(xiàn)在用一個簡單注釋的multiplot例子來說明,分別畫出正弦,余弦和它們的倒數(shù)曲線。基本方法是將屏幕或圖形
文件邊框比例設(shè)置為1。接著,我們畫這些不同的曲線讓它們分別占據(jù)四分之一的屏幕。我們也用設(shè)置屏幕原點坐標(biāo)的辦法控制曲線顯示的位置(參看help
coordinates中有關(guān)不同坐標(biāo)系統(tǒng)的討論)。也要注意,每次繪制都是自動計算軸的寬度,標(biāo)注等等----所以,你可能需要修改空白寬度來對齊不同
的圖。在這個例子里,我必須設(shè)置左邊距為6字符寬,以容納cosec(x)
= 1/sin(x)用科學(xué)計數(shù)法的標(biāo)注。
代碼7.多圖示例 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.多圖繪制
![]()
繪制數(shù)據(jù)
雖然本文大多數(shù)情況下,為了說明目的,集中討論正弦曲線的繪制,但你可能最想畫來自實驗或銷售或類似的數(shù)據(jù)。這一節(jié),如何畫不同的使用IBM股價作為數(shù)據(jù)集的圖(這個例子的原始數(shù)據(jù)放在資源那節(jié)):
表1.IBM股價
Date Open High Low Close
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.120
大多數(shù)數(shù)據(jù)集都是數(shù)字集,但這一個不同,x軸是時間數(shù)據(jù)。下面的曲線告訴gnuplot如何讀取和格式化x 軸上的時間數(shù)據(jù)(參看help time/data和help set timefmt以獲得更多細(xì)節(jié)):
代碼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風(fēng)格而不僅是points風(fēng)格:
plot
["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2 with
linespoints
圖8.IBM股價圖
![]()
和前面一樣,明確設(shè)置xrange["31-May-04":"11-Jun-04"],但這也不是嚴(yán)格必須的。注意,區(qū)間里的最小最大值要定義成timefmt中一致的字符串。
依賴于所用的繪圖風(fēng)格,gnuplot在畫一個點時,可以用到最多6個不同的數(shù)字。當(dāng)一個記錄被讀入,那列數(shù)據(jù)被標(biāo)記為從1開始。using 1:2告訴繪圖命令使用第一列作為x軸和第二列作為y軸。所以,要畫收盤價,我們就得使用using 1:5。
gnuplot每讀到一個新數(shù)據(jù)分隔符就增加列數(shù)據(jù)字。缺省分隔符是空白符。所以,如果我們的時間格式中間有一
段空白(例如,10 Jun
04而不是10-Jun-04),我們需要使用1:4而不是1:2。對x軸,我們只需要定義第一列,數(shù)據(jù)從那里開始。gnuplot有足夠的智能使用時間
串去讀其它列。
你可以用using添加多于2個冒號來定義額外的數(shù)據(jù)列,這可能是一些繪圖風(fēng)格所必須的。你也能用使用了$n表
示第n列數(shù)據(jù)的聲明表達式繪圖。在這個完全虛構(gòu)的例子里,我們假設(shè)不同的價格代表一次不同的實驗,并且我們想繪制平均數(shù),最高值和最低值。你可以用
yerrorbars風(fēng)格繪制y-high/y-low值,這里我們在using修飾語句里定義為x:y:ylow:yhigh,并用($2+$3+$4
+$5)/4來計算的4個價格的平均數(shù)作為y軸: 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風(fēng)格類似,但它在畫了的y點之間也畫線段。gnuplot還專門有一個風(fēng)格用來畫經(jīng)濟數(shù)據(jù)條的,有最高最低值還有左右的小標(biāo)記來分別標(biāo)記開盤收盤價。我們使用set bars來顯示開盤收盤價的大標(biāo)記:
set bars 5 plot
["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2:3:4:5 with
financebars
圖10.畫經(jīng)濟數(shù)據(jù)條
![]()
你還可以查詢help plotting styles,查看其它相關(guān)風(fēng)格,象是candlesticks, boxerrorbars和error風(fēng)格。
處理真實生活中的數(shù)據(jù)集
當(dāng)然,真實生活中的數(shù)據(jù)集里問題更復(fù)雜。用非空白符分隔數(shù)據(jù)點的數(shù)據(jù)集很常見。作為gnuplot4.0的新功能,
你可以用set datafile separator
來設(shè)置你自己的分隔符。類似的,你也可以定義一個注釋符來代替#,用命令set
datafile
commentschar。如果你需要更多控制,你可以為using修飾短語明確定義一個格式串。gnuplot根據(jù)所給的格式串(參看help
using了解所有細(xì)節(jié)),用C語言標(biāo)準(zhǔn)庫函數(shù)scanf的方式讀數(shù)據(jù)。我僅僅是為了完整性而提起這個方法的,大部分可以用這種方法讀入的數(shù)據(jù)集,也可以
使用set data file separator或明確定義using短語中的列數(shù)字來處理。例如,如果你在第一列有一個需要忽略,用plot
using
2:3就行了。為了完整的柔性,在帶有popen函數(shù)的類UNIX系統(tǒng)里,你可以使用文本處理工具預(yù)處理文件后再傳給繪圖命令。例如:plot
"
有時,真實生活中的數(shù)據(jù)集可能不包括所有數(shù)據(jù)點----可能有一個x值,但對應(yīng)的y值在你準(zhǔn)備繪制的那列可能丟失了。gnuplot允許你定義一個字符串來表示丟失數(shù)據(jù)點。例如:
set datafile
missing 'NaN' # The IEEE floating point not-a-number
注意,4.0版之前,這個命令是set
missing 。
不幸地,丟失數(shù)據(jù)的數(shù)據(jù)點處的處理與using設(shè)定相關(guān)。如果你想知道使用plot
'file', plot 'file' using 1:2, 和 plot 'file' using
($1):($2))之間區(qū)別的詳細(xì)細(xì)節(jié),請參看help
using。但安全起見,定義數(shù)據(jù)列時請堅持使用明確的using格式,并且,如果你想完全刪除壞數(shù)據(jù)點,不要使用表達式評價(因為括號,第三個選項評價
表達式)---- 而預(yù)處理數(shù)據(jù)文件和增加明確的表達式計算結(jié)果數(shù)據(jù)列更好些。
還有時,你數(shù)據(jù)集的結(jié)束數(shù)據(jù)可能無效。如果能通知gnuplot無效的數(shù)據(jù)點,你仍然可以畫出此數(shù)據(jù)集。
gnuplot只是安靜地忽略未定義點,所以有個小技巧,當(dāng)你遇到不合適的點就使用一個未定義的象1/0之類的y值。象C語言中的三重操作符來表達這種情
況非常方便(如果你對這個函數(shù)不熟悉,請參看help ternary;它在分段函數(shù)定義中也很有用)。這里有一個在help
using中提到的例子,讓你把第二列數(shù)據(jù)當(dāng)作y值畫出,除非第三列大于10:
plot 'file'
using 1:($3>10 ? $2 : 1/0)
一個高級例子
雖然本文已經(jīng)展示了大部分你最終會常用的功能,偶爾,你需要做些更深奧的東西。這一節(jié),我們簡要地討論一些這方面的內(nèi)容,接著引用一段來自gnuplot演示文件中的腳本(electron.dem),它畫了一條在電子器件用途演示中常見的幅頻響應(yīng)曲線。
1.用戶定義函數(shù)和變量
你可以定義自己的任意復(fù)雜的函數(shù),類似下面提到的A(jw)。它可以帶參數(shù)(p1,
p2),而且,你可以稍后再定義這些參數(shù),只要在繪圖命令使用它們之前就行。
2.復(fù)數(shù)
gnuplot可以理解復(fù)數(shù)。符號{a, b}代表復(fù)數(shù)a+bj。你可以用函數(shù)abs()和arg()計算模和輻角。
3.啞變量
當(dāng)你在繪圖命令中使用sin(x)時,gnuplot把x作為啞變量使用,給它賦不同的值來得到樣本。當(dāng)你在寫復(fù)雜的用戶定義函數(shù)時,你可以在函數(shù)定義時用傳統(tǒng)變量名,并明確指定該名字用于啞變量(例如,set dummy jw)。
4.x2和y2軸
除了熟悉的圖形底部和左邊的x和y軸,你還可以使用圖
形頂部(x2)和右邊(y2)作為獨立的軸。這些軸是完全獨立的,你可以單獨設(shè)置范圍,標(biāo)記,名字和比例(比如,對數(shù)比例)。繪圖命令也可以通過使用
axes短語使用不同的軸集象x2y2。缺省情況下,繪圖命令在xy軸上工作。當(dāng)你需要同時繪制級數(shù)不同的幅值,或有不同單位的曲線時,這個高級特性就很
有幫助。下面的例子里,y軸畫幅值,最大為1,而y2軸畫相位,最大值為100。如果用同一套軸畫,幅值曲線就僅僅能看見而已了。
5.對數(shù)比例
你可以用命令set logscale來繪制任何軸為對數(shù)比例。這個命令在對應(yīng)軸上畫以10為底的對數(shù)值。你可以明確設(shè)置要使用的底(例如,set logscale 2, 或 set logscale xy 2,如果只設(shè)置主要的x-y軸)。
這就是從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é)論
本文,我們討論了使用gnuplot4.0來繪制2D圖形的復(fù)雜性。雖然,我們觸及了大部分使用gnuplot
的重要方面,由于篇幅所限,還有一部分內(nèi)容我們沒能討論。最重要的省略包括很簡單的帶參數(shù)函數(shù)繪制(見help
parametric),和極坐標(biāo)(help
polar),到曲線擬合,就是擬合用戶定義的曲線到給定的數(shù)據(jù)集上。曲線擬合是個藝術(shù),需要一整篇的文章來講述,但查詢help
fit和beginners_guide and tips子標(biāo)題來開始。
經(jīng)常使用的竅門
就如我們所見,gnuplot是高度可定制的。我總結(jié)的最后竅門是如何把你的定制用于多個gnuplot會話:定制
最主要的命令是set命令。你可以用save
set ‘filename’來保存你當(dāng)前會話里的所有設(shè)置;用save var 和save func
分別保存用戶定義的變量和函數(shù)。但是在單個繪圖命令里使用的定制(例如plot [-pi:pi]
sin(x)里的xrange)是無法保存的。這些文件可以用load 讀回來。gnuplot在啟動時也會查詢一個叫.
gnuplot的文件。它先在當(dāng)前目錄,接著在用戶主目錄(在Windows里是USERPROFILE目錄)查找。如果找到初始化文件,gnuplot
就執(zhí)行里面的命令。一些用戶就用這個設(shè)置終端類型和定義常用的函數(shù)和變量。
資源
· Visit
the official site for gnuplot
and
download the latest version
.
· Do please note that gnuplot
is not GPL'd, nor in any way related to
GNU
or the Free Software Foundation.
An older GNU bulletin
explains: "Curiously, [gnuplot] was neither written nor named for the GNU
Project; the name is a coincidence. Various GNU programs use gnuplot."
· Indeed: gnuplot works
exceptionally well in combination with the
GNU plotutils
; see also the plotutils
documentation.
· The official
Gnuplot FAQ
is very useful, as
is the unofficial not
so Frequently Asked Questions site (the latter has specific information
about using gnuplot in scientific papers).
· A Google
search on "gnuplot introduction" or "gnuplot tutorial"
yields several short gnuplot 3.7.x tutorials that can be useful, even though
they reference the previous, and not the most recent, release version.
· Download the IBM
stock price data (ibm.dat) used for the data plots, and the example
TeX file (input.tex), which shows how you can include gnuplot plots in a
LaTeX report.
· The article " Data
visualization using Perl/Tk" (developerWorks, 2003) discusses plotting
with Perl.
· For an overview of using
ImageMagick from the command line, read "Graphics from
the command line" (developerWorks, July 2003).
· "Introduction
to Scalable Vector Graphics" (developerWorks, 2004) shows how
to to easily generate graphics (such as graphs and charts) from database
information, and how to to add animation and interactivity to graphics.
· Find more resources for
Linux developers in the developerWorks
Linux zone.
· Browse
for books on these and other technical topics.
· Develop and test your Linux
applications using the latest IBM tools and middleware with a developerWorks
Subscription: you get IBM software from WebSphere, DB2, Lotus, Rational,
and Tivoli, and a license to use the software for 12 months, all for less money
than you might think.
· Download no-charge trial
versions of selected developerWorks Subscription products that run on Linux,
including WebSphere Studio Site Developer, WebSphere SDK for Web services,
WebSphere Application Server, DB2 Universal Database Personal Developers
Edition, Tivoli Access Manager, and Lotus Domino Server, from the Speed-start
your Linux app section of developerWorks. For an even speedier start, help
yourself to a product-by-product collection of how-to articles and tech
support.
[color="#000099"]原文地址
http://www.ibm.com/developerworks/library/l-gnuplot/
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u3/97596/showart_2002971.html |
|