歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

LINUX中使用gnuplot 讓您的數據可視化(2)

  圖 7. Multiplot 繪圖     繪制數據圖  雖然本教程只是出於說明目的,大部分內容都集中於繪制正弦曲線,您很可能很想對試驗數據、銷售數據或其他類似數據繪圖。在這一節,我們將使用 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),到曲線擬合(它使用戶定義曲線與




Copyright © Linux教程網 All Rights Reserved