總體上感覺:gnuplot是一個很輕量的開源科學繪圖工具,而且用起來簡潔利索,單從繪圖的角度上說有了它一般的實驗什麼的都可以完全拋棄臃腫緩慢的matlab了。
另外它是一個跨平臺的工具,windows和linux下都可以用。
畫出來的圖也挺漂亮的。
這兩天做數據挖掘報告要畫些圖說明一下問題,我的工作機上又沒有matlab,mathwork之類的工具(我嫌大嫌慢),又不好意思總去找別人,就研究了一下我自己的存貨。發現以前用libsvm的時候依賴了一個叫gnuplot的工具貌似可以用。
說一下第一次用gnuplot執行plot命令的時候它要初始化很多東西,會比很慢,一度讓我以爲是死機了,要做好心理準備。
言歸正傳:
綜述:
gnuplot的基本用法是命令式的,它有兩個窗口,在一個標準的命令行窗口裏面輸入命令就像一個shell,它會在另一個窗口裏面繪製出圖形。另外它是支持腳本運行的,可以在shell裏面調用。
它自己帶有一個幫助文檔,建議打開程序之後輸入help打開一個參考手冊,對照着用。
額外說一句,我這兩天發現有一個小夥義務地把gnuplot的手冊漢化了,而且在物慾橫流的今天,居然在CSDN資源站上提供免積分下載,贊一個!
大家可以搜“gnuplot 4.6 中文手冊”提供個現在(2012-11-8)最新的地址:http://download.csdn.net/detail/zdl_361/4684085。
基本用法:
gnuplot有兩個基本繪圖命令,一切都靠它們:plot和splot。
基本用法是這樣的:
plot sin(x)
splot sin(x)*cos(y)
plot負責畫二維圖形,默認以x作爲自變量;splot負責畫三維圖形,默認以x和y作爲自變量。順便說一下gnuplot的三維圖形旋轉功能真是比matlab好用多了。
定義函數:
gnuplot自己提供了許多基本函數,另外我們還可以定義自己的函數,定義的方法是直接在一行上面寫定義,需要用等號連接:
f(x,y)=sin(x)*cos(y);
splot f(x,y)
畫多個圖:
方法一:
用逗號間隔,例如:
plot sin(x),x
就畫了sin(x)和x兩條線。
方法二:
用replot(resplot)命令。
寫完一個plot之後再寫一個replot語句,後者不會替換掉前者,而是繪製在同一個圖裏。例如:
plot s(x)
replot x*x
指定範圍:
有時候需要指定各個座標的範圍,而用圖形界面只能放大,不能縮小和平移(至少4.4版本是這樣的),這就必須在命令中指定。
方法:中括號報告數據下限和上限,內部用冒號間隔。第一對中括號表示x軸的範圍,第二對錶示y軸的範圍,第三對錶示z軸的範圍。
例如:
plot [-1:3][3:4] cosx(x)
splot [-pi:pi][-pi:pi] sin(x)*sin(y)
需要注意的是,這一次你定義了範圍,下一次默認也還是這個範圍,所以用的時候最好每個命令都帶上範圍。
with:
可以用with語句跟在主繪圖語句後面,來選擇效果,它支持連線、畫點、畫脈衝圖、畫曲面等等,可以在一個語句後面只加一個with看提示。
例如我要畫一個脈衝效果的正弦圖像:
plot sin(x) with impulses
我要畫一個有漸變顏色效果的圖:
splot sin(x)*sin(y) with pm3d
另外with是可以縮寫的,例如with lines可以縮寫成w l
using:
可以在繪圖命令後面加using修飾,根據我的理解using的作用是選擇數據的某些維度(也可以通過表達式將不同維度的變量進行計算生成新維度)。
這個東西放在文件那裏介紹。
根據文件繪製:
這個功能比較複雜,我只瞭解一些簡單的東西,總結如下:
使用單引號打開文件,文件中的數據一行是一個數據向量。
例如我有一個文件(D:\a.txt):
1 2 4
2 1 3
4 5 2
2 4 5
那麼打開之後它gnuplot會認爲它有4個三維的數據。
splot [0:5][0:5] 'D:\a.txt' with lines
這裏我還可以用using指定我要用選用部分維度的數據,例如我要用第一維做x座標,分別以另外兩維爲縱座標話兩個折現統計圖:
plot 'd:\a.txt' using 1:2 with lines
plot 'd:\a.txt' using 1:3 with lines
特殊文件:
gnuplot提供了2個特殊文件:'+' 和'++'。他們分別用來生成一維和二維的連續數據。在使用生成的數據時要用:$1和$2
例如:
f(x,y)=sin(x)*sin(y)
splot [-4:4][-4:4] '++' using 1:2:(f($1,$2)) with pm3d
注意因爲'++'是一個文件,這裏不能直接寫函數,需要用using類完成函數的表示,不過要注意各個維度之間要用冒號分開,複雜的維度表達式要用括號括起來。