linux中使用gnuplot使您的數據可視化

linux中使用gnuplot使您的數據可視化 

      基礎
   通過在 shell 命令提示符中輸入 gnuplot 啓動 gnuplot。您首先看到提示符號 >。該提示符是進入 gnuplot 的輸入點;Linux 用戶將習慣於這種方式。例如,您可以使用方向鍵來查找以前輸入的命令歷史記錄,然後編輯和重新執行這些命令;Home 和 End 鍵與平時使用沒有區別。可以對 gnuplot 進行重新編譯以便使用 GNU readline 庫在輸入提示符上來回移動,但類似於默認函數。
  
  Gnuplot 提供了廣泛的在線幫助,如果您要做任何有用的事情,則肯定會用到這些在線幫助。語法是統一的:通過輸入 help

圖 1. sin(x)


  

 


   我們剛剛創建了可能是最簡單的圖。讓我們看看如何以不同方法定製該圖。假設我們只想看到一個正弦曲線週期。我們通過限制圖的默認 x 範圍來完成此操作。使用表示法 [min:max] 來指定範圍。要僅指定最小值,使用 [min:];要僅指定最大值,使用 [:max]。數學上稱此爲所謂的“閉”區間表示法。
  
  這裏我們使用 [-pi:pi] 得到一個正弦曲線週期:
  
  清單 1. 從 -pi 到 +pi 的 sin(x)
  
  set xrange [-pi:pi]
  replot
  reset
  
  

圖 2. 重繪正弦曲線圖


  

 


   我們剛纔使用了 replot 命令,它執行先前的 plot 命令。當您繪製曲線圖且需要不斷對該圖進行修改以添加想要的特徵時,此命令會非常有用。另外,replot 使您可以添加更多的圖。嘗試輸入 replot cos(x)。依照語法,該命令等同於 plot sin(x), cos(x)。Replot 就是獲取先前的繪圖字符串,添加必要的逗號,然後附加輸入給它的其餘部分。
  
  使用的最後一個命令 reset 對於繪製正弦曲線不是必要的。它移除先前所有 set 命令的效果並恢復默認值。因此,在本例中,它將使用默認 x 範圍。
  
  現在讓我們嘗試一些更奇特的東西:plot 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"(放在引號中)、 和 。
  
  清單 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)


  

 


   注意對 +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 相關的終端(eepic、latex、pstricks、texdraw、tpic 等等)。您還可以得到 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} 得到上標文字。還要注意縮寫的終端


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

 


  大多數數據集合都是數字列,但是這個數據集合有所不同,因爲 x 軸是時間數據。下列代碼告訴 gnuplot 如何讀取和格式化 x 軸上的時間數據(有關詳細信息,請參閱 help time/data 和 help 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. 繪製開盤價圖


  

 


  象往常一樣,["31-May-04":"11-Jun-04"] 顯式設置了 xrange,但不是完全必要的。注意範圍的 min 和 max 需要指定爲符合 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. 計算平均值


  

 


   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. 繪製財務條形圖


  

 


  您還可以查看 help plotting styles 獲得其他相關樣式,如 candlesticks、boxerrorbars 和錯誤繪圖樣式。
  
  處理真實數據集合
  當然,對於真實的數據集合,事情可能會變得更復雜。最常見的就是數據集合不使用空格字符分隔數據點。gnuplot 4.0 提供了新的功能,您可以使用 set datafile separator 指定自己的分隔符。同樣地,您還可以使用 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 。
  
   不幸的是,處理缺少數據的數據點的方法取決於 using 說明。如果想了解用法 plot 'file'、plot 'file' using 1:2 和 plot '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)中的腳本,該腳本繪製電子學中常見的幅頻響應圖,用以說明它們的用法。
  
  用戶定義的函數和變量
  您可以任意定義自己的複雜函數,如下面的 A(jw)。這些函數可以用參數 (p1, p2) 表示,您可以稍後在 plot 命令中使用它們之前再定義參數變量。
  複數
  Gnuplot 可以識別複數。{a,b} 表示複數 a+bi。您可以使用函數 abs() 和 arg() 獲得絕對值和輻角。
  虛變量
  當在 plot 命令中使用 sin(x) 時,gnuplot 將 x 用作虛變量,並對它賦不同的值以獲得示例。當編寫複雜的用戶定義的函數時,您可以使用函數定義中使用的傳統變量名稱,也可以顯式設置要使用的虛變量的名稱(例如,set dummy jw)。
  x2 和 y2 軸
   除了常見的沿着曲線圖底部和左邊的 x 軸和 y 軸之外,還可以使用曲線圖的頂部(x2)和右端(y2)作爲單獨的軸。這些軸都相互獨立,可以單獨設置範圍、tics、標籤和比例(例如對數刻度)。而 且,通過使用 axes 子句,plot 命令可以使用不同的軸集合,如 x2y2。默認情況下,plot 命令以 x 軸和 y 軸繪圖。當您需要同時繪製範圍爲不同量級或具有不同單位的線時,此高級功能非常有幫助。在下面的示例中,y 軸繪製振幅,最大值爲 1,y2 軸繪製相位,最大值爲 100。如果對軸的相同集合繪圖,振幅曲線幾乎看不出來。
  對數刻度
  您可以使用 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
  
  

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


  

 


  結束語
   在本文中,我們討論了使用新發布的 gnuplot 4.0 繪製 2D 圖形的複雜性。雖然我們接觸了大多數的關於使用 gunplot 的重要方面,但限於篇幅有限,我們仍有少數主題沒有討論。值得注意的一些省略範圍包括從非常簡單的參數函數繪圖(請參見 help parametric)、極座標(help polar),到曲線擬合(它使用戶定義曲線與


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章