pgplot 繪圖副程式庫

 

 

安裝 暨 建構 pgplot 的方法

 

取得套件

取得套件(在此以 pgplot 5.2 版為例),教室機器目錄 /NFS_home/pgplot/ 下也有放,名稱是 pgplot5.2.tar.gz (另外 /NFS_home/pgplot/pgplot 則是 pgplot 主目錄)。copy 到自已的目錄下(如 /NFS_home/u12345678)

PGPLOT 的官方網站:http://www.astro.caltech.edu/~tjp/pgplot/

 

準備目錄

選擇一個暫時放置原始碼包的目錄(打 mkdir /NFS_home/u12345678/pgplot_source),並更改目前所在目錄位置到這個暫時目錄(打 cd /NFS_home/u12345678/pgplot_source),打下列指令解開 (tar -zxf /NFS_home/u12345678/pgplot5.2.tar.gz),如此會在 /NFS_home/u12345678/pgplot_source 目錄下再多產生一個 pgplot 目錄,內有完型整的原始碼套件。基本上先要看的讀我檔案是 aaaread.me,安裝步驟則寫在 install-unix.txt 。

 

編輯 drivers.list 清單

pgplot 支援不同的畫面顯示及檔案輸出方式可供選擇,這是透過編輯 drivers.list 清單來打開或關掉的。不同作業系統環境之支援度並不相同,最好選剛好夠用的就好了,以避免選到某些不支援的 driver,就要回去開關掉再重做(所有選擇的 drivers 都有支援到,建構 pgplot 環境的動作才會進行下去)。大家可用在 vi 編輯 drivers.list,前面有 "!" 局符號的就代表該項關閉,把 "!" 號刪除就代表該項打開。我們一般至少會選 /NULL、/XWINDOW 以及 /XSERV。如果稍後下 make 指令之後有不能完成而有錯誤的話,可試著把錯誤訊息中提到之有關係的 device 關掉再重做,例如有些系統不支源 /XDISP。

 

產生 makefile 檔

編輯完了 drivers.list 清單之後,我們要選擇並建立將來 pgplot 套件在系統中存放的目錄,如果你有管理者權限,則放在公共目錄大家用起來會比較方便(如 /usr/local/pgplot );若你沒有管理者權限,則在使用者自己任何的目錄下都沒有關係。比方說,你決定完成後的 pgplot 目錄要放在 /NFS_home/u12345678/pgplot,則先在你的 $HOME 目錄位置下建立 pgplot 目錄(打 mkdir /NFS_home/u12345678/pgplot),然後 cd 到那個目錄堙]打 cd /NFS_home/u12345678/pgplot),然後在該目錄下打

/NFS_home/u12345678/pgplot_source/pgplot/makemake /NFS_home/u12345678/pgplot_source/pgplot linux

上述長指令有三個部分,第一個是指令 makemake 的位置(makemake 是 pgplot 作者寫的一個 script,它並不是一個 UNIX 指令),它前面的一長串路徑是當初原始碼套件包解開的暫放位置,第二部分是原始碼目錄路徑,第三個部分是作業系統類別,在此給 "linux"。如果安裝的 compiler 不同或多於一種而使 pgplot 無法自行偵測找到它要的或是你特別想指定的,則上述長指令後面可再給一個參數,詳細說明請見 install-unix.txt。

以有安裝 g77 的 Fedora Linux 為例,可選擇 :

/pg_src_dir/makemake /pg_src_dir linux g77_gcc_aout

其中 /pg_src_dir 在這堨N表解開之 pgplot 原始碼套件包所在的位置。

以有安裝 gfortran 的 cygwin 為例,可選擇 :

/home/u01/pg_src_dir/makemake /home/u01/pg_src_dir cygwin gfortran_gcc

其中 /home/u01/pg_src_dir 在這堨N表解開之 pgplot 原始碼套件包所在的位置。

 

 

下 make 指令

如果上述 "makemake 路徑 作業系統 [編譯器選項] " 有成功,則你在目前目錄(pgplot 安裝目錄)下會看到以下檔案

drivers.list
grexec.f
prpckgl.inc
makefile
pgplot.inc
rgb.txt

再來,你就可以在目前目錄下打 make (make 是一個重要的 UNIX 指令,有興趣同學請打 man make 或參考線上 UNIX 辭典) 。它會根據目錄下的 makefile 一步步編譯所有 pgplot 提供的副程式,產生物件檔 (*.o) 並加以組裝成程式庫檔 (library file) 的格式,我們主要就是要那個 libpgplot.a 的 library 檔。 另外,由於我們有選擇 /XWINDOW/XSERV,會再多產生 pgxwin_server 可執行檔;又因為我們也選了/XDISP, 會再多產生 pgdisp 可執行檔。

Note : For Ubuntu (a kind of Linux Distribution) user, there will be error message :

PGPLOT錯誤訊息
.//pgdispd/proccom.c:166: 錯誤: 與 「malloc」 類型衝突

解決方法: 將 proccom.c 的 line 166 註解掉

 

跑範例程式測試

最後,我們跑範例程式來測試是否完全成功。為了讓顯示程式知道 pgplot 的安裝目錄在那堙A才能讀得到所需的檔案,首先要確定環境變數有把 PGPLOT_DIR 定義好,這需要在 csh/tcsh 打下列指令:

setenv PGPLOT_DIR /NFS_home/u12345678/pgplot

或 sh/bash/ksh 下打下列指令:

set PGPLOT_DIR = /NFS_home/u12345678/pgplot ; export PGPLOT_DIR

註:如果你沒有設上述的 PGPLOT_DIR 環境變數,只要把 pgxwin_server 拷貝到系統公用的可執行檔目錄 如 /usr/bin 之下,絕大部分的功能也都能正常執行。

跑範例程式的方法,是打其程式的名稱,如 ./pgdemo1(若不在目前目錄下則需包含適當的路徑)。

如果你的 shell 抱怨它找不到 libpgplot.so,則你可以先打 tcsh 再打

setenv LD_LIBRARY_PATH /NFS_home/u12345678/pgplot

然後再執行 ./pgdemo1

註:若未設定 PGPLOT_DIR 這個環境變數(方法見上),有可能導致 pgplot 無法顯示文字,特此提醒。

 

設定使用者登入的預設環境值

很多複雜的程式,由於需要其特定目錄下的其他協同工具程式一起運作,或是需要其特定目錄下的某些資料,甚至是設定值,因此需要系統藉由環境變數來告訴主程式這些特定的目錄在那堙C這種替特定程式設定環境變數的動作,固然可以由使用者直接下指令或是寫一個自動執行的 script 來進行,但這樣做使用都者都仍需記得去下一個或一些指令。如果每次進入系統都希望有那樣的環境變數設定,則可次在 shell 的 .cshrc 成 .profile(或 .login)

.profile 是每次登入系統時要做的動作,而 .cshrc 則是每次起動

如果你用的是 bash,則 .bashrc 與 .bash_profile 是對等於前者的兩個檔。

.cshrc 及 .profile 範例
http://phi.sinica.edu.tw/aspac/notes/94/N94002/
http://netlab.cse.yzu.edu.tw/~statue/freebsd/docs/aasir/ch18.pdf
http://ece.niu.edu.tw/~chu/download/doc/UNIX.txt

 

pgplot 使用的環境變數範例

以 S105 電腦教室的環境為例(使用 csh / tcsh shell 環境):

set path = (/NFS_home/pgplot/pgplot $path)
setenv PGPLOT_DIR /NFS_home/pgplot/pgplot

setenv LD_LIBRARY_PATH /NFS_home/pgplot/pgplot

setenv PGPLOT_FONT /NFS_home/pgplot/pgplot/grfont.dat

你可以把這個 script 叫做 set_pgplot.csh,每次使用 pgplot 前在 tcsh/csh 下(電腦教室使用者預設的 shell)打 source set_pgplot.csh 即可。

至於在考試用的 VMware 環境,除了前述標準方法(其中 -L /usr/local/pgplot -lpgplot 請放在整行的最後面,在我們現在的系統中比較容易找得到):

gfortran -o my_prog.x my_prog.f -L /usr/X11R6/lib -lX11 -L /usr/local/pgplot -lpgplot

之外,也可用以下作法:先把 libpgplot.a/usr/local/pgplot~/examples 目錄 copy 到目前工作的目錄來,在編譯鍊結時則改下(以下要打在同一行)

gfortran -o my_prog.x -L /usr/X11R6/lib -lX11 my_prog.f libpgplot.a

 

如何用撰寫及編譯可利用 pgplot 繪圖的 Fortran 程式

 

撰寫

學習如何使用 pgplot 最好的方法,是:

(1) 編譯並執行其內附的一系列範例程式 pgdemo1.f ~ pgdemo17.f(在本課程給大家的虛擬機器是放置在 /usr/local/pgplot 下;在教室的機器是放置在 /NFS_home/pgplot/pgplot/examples 內,自行安裝者請到 pgplot 主目錄下的 examples 目錄找)(建立完 pgplot 環境及副程式庫後會自動產生 pgdemo1 ~ pgdemo17 可執行檔,因此也可以去 copy 過來而不必自行編譯),觀看其功能展示。再

(2) 到相關程式及副程式中參考其指令(繪圖副程式)名稱及其使用的方式,並同時

(3) 從線上手冊查詢該指令(副程式)中之各參數意義及用法的精確定義。

pgdemo1.f 中的 EX01 為例

EX01 code

,其畫出之效果如下:

pgdemo_EX01

請注意,從本範例所學到的經驗,一個最簡易的 PGPLOT Fortran 程式具有以下基本格式:

program pg_test
integer pgopen
real xmin, xmax, ymin, ymax
if (pgopen('/xwin') .le. 0) stop
call pgenv(xmin,xmax,ymin,ymax,0,0)

...

call pgclos
end

 

一個簡單的範例程式 pg_test.f ,在 x, y [-5,5] 範圍內畫一個中心在原點、半徑 2 的圓。

program pg_test
integer pgopen
real xmin, xmax, ymin, ymax
if (pgopen('/xwin') .le. 0) stop

xmin = -5.0
xmax = 5.0
ymin = -5.0
ymax = 5.0

call pgenv(xmin,xmax,ymin,ymax,0,0)
call pgcirc(0.0,0.0,2.0)

call pgclos
end

 

編譯的指令

gfortran pg_test.f -L /usr/local/pgplot -lpgplot -lX11

則打 ./a.out <Enter> 就可以執行。

 

最重要之基本指令

PGOPEN

這是一個整數值函數,一被運算就會開啟顯示或印出的介面(即當初 drivers.list 所打開的裝置之一),它的引數是裝置名稱的字串(含前面的斜線 "/",如 "/xwin"),其結果的值則表示介面裝置開啟的成功與否。如果是整數 0 則表示開啟成功,非零值代表失敗。要使用 PGPLOT 的繪圖功能之前一定要叫用這個函數,以下為常用的語法示範:

INTEGER PGOPEN
...
IF (PGOPEN('?') .LE. 0) STOP


這表示向使用者詢問輸出表置類別,開啟失敗則程式停止。


integer pgopen
...
if (pgopen('/xwin') .le. 0) stop


這表示直接使用 /xwin 裝置,不必詢問。一樣若開啟失敗則程式停止。

 

PGENV

設定繪圖環境值,包含視窗大小及比例、x 軸 y 軸範圍、以及座標軸之畫法。

CALL PGENV (XMIN, XMAX, YMIN, YMAX, JUST, AXIS)

PGLAB

印上座標軸及圖面上方的文字標簽

CALL PGLAB (XLBL, YLBL, TOPLBL)

PGLINE

從給定的一套 N 個值的 X(N) 與 Y(N) 座標陣列值堙A連筆畫出直線段。

CALL PGLINE (N, X, Y)

PGPT

從給定的一套 N 個值的 X(N) 與 Y(N) 座標陣列值堙A一次畫出個別符號點。符號之類型可選擇,如下圖:

另可參考 PGPNTS ,每批符號可以不一樣。

 

PGCLOS

關閉。如果沒有使用,則繪圖跑完後其螢幕上的圖形也隨著程式執行的結束而消失,使用 PGCLOS 讓使用者有機會看清楚圖形後再關圖。

CALL PGCLOS

 

常犯錯誤之提醒

pgenv 堛 x、y 範圍使用了整數

pgenv 堛 x、y 上下限(即前四個數字)誤傳了整數或整數變數進去, 圖框/軸會畫不出來。

程式的最後沒打 call pgclos

pgclos 會給出按 Enter 後關閉的提示,在圖面消失之前給操作者足夠的觀察時間。若未作 call pgclos,則除非是程式本身還在跑或等待,否則程式一旦結束,前先前畫出的圖形就會馬上消失。

忘記宣告 pgopen 為整數

pgopen 是一個整數函數,不同於大部分 pgplot 指令採副程式呼叫的方式, 因此需要宣告其為整數,否則無法執行。

沒給正確的函式庫名稱或路徑

-L -l 參數沒給或 X11 (英文字母大寫 X 及數字 11) 打錯字,會造成函式庫連結不到而造成編譯(鏈結)時抱怨有些東西 "reference" 不到而無法產生可執行檔。

 

其他有用之指令

PGSCI

設定顏色 (Set Color Index),背景色是 0。

PGCURS

在滑鼠指標所在的任置接任一文字鍵可傳回該位置的絕對座標以及所按的字符,是很有用的互動式輸入工具。

PGBAND

與上述指令類似,只是多加了滑鼠指標在移動時有一條線連著上一次選取的點,"Elastic band 即橡皮筋"。

PGPAP

設定圖框 (紙張 PAPer) 大小(要在 PGENV 之前使用),所給入的兩個實數參數分別是 x 的長度以及 y 相對於 x 的長度大小。例如,若要作出 x 邊長是 5 吋的 4:3 的畫面,則呼叫 PGPAP (5.0, 0.75) 。

另外,如同其他所有 PGPLOT 副程式,用到實數參數的數值,一定要帶有小數點,因此上例中之 PGPAP (5.0, 0.75) 不可以寫作 PGPAP (5, 0.75),請注意。

PGCIRC

畫圓,三個實數參數分別是 x-座標、y-座標,以及半徑。

PGSFS

設定填色屬性 (Set Fill-area Style)。會影響 PGCIRC、PGRECT、PGPOLY 畫出是空心的或是填滿的。

PGTEXT 及 PGPTXT

在圖上印出文字

PGPANL

切換到圖面上不同的面版(經由 PGSUBP 或 PGBEG 所切割出來的)

PGSLCT

選擇輸出裝置,裝置的整數號碼是由整數函數 PGOPEN 所傳回的值。

 

其他有趣之指令

PGBBUF 與 PGEBUF

緩衝區功能。把眾多繪圖動作夾在 PGBBUF 與 PGEBUF 之間,能大幅提昇繪圖效率。

註:這是因為任何新圖像在螢幕上的呈現,都須經由 CPU 先將畫素資料寫入視訊記憶體 (Video RAM,,即顯示卡上附帶的記憶體) ,再更新顯示為畫面亮暗點 。因此儘可能將新內容連續寫入視訊記憶體,在一次刷新,會比較有效率。

 

 

編譯與鏈結

在本課程給大家的虛擬機器環境下,要編譯目前目錄下的 pgdemo1.f ,要打:

gfortran -o pgdemo1.x pgdemo1.f -L /usr/local/pgplot -lpgplot -lX11

這是因為 UNIX X-視窗所會需要的 libX11.a 已經放在系統可來搜尋得到的目錄下。

 

如果你使用 cygwin,並假放安裝的目錄是在 /usr/local/pgplot,則可能要把副程式庫鏈結移置到後面,如下:

g77 -o pg.exe pg.f -L /usr/local/pgplot -lpgplot -lX11

 

在計算物理實驗室現行的安裝設定下,在存放你自已程式(在此以 pgdemo1.f 為例)的目錄下打:

f77 -o pgdemo1.x -nobackshash -L/usr/X11R6/lib -lX11 -lpgplot pgdemo1.f

其中 -nobackslash 參數是為了讓圖的標題文字可以顯示上標(次方),這在 pgplot 中要用到反斜線 "\" 符號,在有些 compiler 會詮釋反斜線符號有特定意義,但在此只是 pgplot 的副程式媕Y要用,因此指定 no back-slash。 (若是 g77 則是 -fno_back_slash

如果你沒有管理者權限,則你的 libpgplot.a (或 .so) 檔不會在系統公共目錄堙C這時要鏈結 pgplot 副程式庫則需要在 -lpgplot 參數的前面給路徑 -L/NFS_home/u12345678/pgplot

 


線上手冊

pgplot.html

官方網站使用說明:http://www.astro.caltech.edu/~tjp/pgplot/contents.html

 

範例程式

pgdemo1.f  直接看原始碼

這堶惘釩雃h且重要的功能示範,有多種繪圖的形態。其中 EX01 的平面作圖示範是最基本的,一定要會。

 

pgdemo2.f  直接看原始碼

示範色塊、字型、記號的活用以及線寬、線型的變化

 

pgdemo3.f  直接看原始碼

各類型等高線的繪製

 

pgdemo4.f  直接看原始碼

色譜(調色板)示範

 

pgdemo5.f  直接看原始碼

支援以滑鼠在平面上取得點的位置以供輸入數據的功能,也支援在圖面上按文字鍵會辨認。

 

pgdemo6.f  直接看原始碼

與上示範類似,但更增加即時自按鍵讀入字元的功能

 

pgdemo7.f  直接看原始碼

示範隱藏線的繪圖功能

 

pgdemo8.f  直接看原始碼

這個程式提供了一個工具副程式,它能把一個 3D 的面投影在 2D 平面上。

 

pgdemo9.f  直接看原始碼

畫素圖檔的示範

 

pgdemo10.f  直接看原始碼

不同部分圖之背景色也以改變

 

pgdemo11.f  直接看原始碼

動畫示範及比較

pgdemo12.f  直接看原始碼

PGPAP 改變圖框的大小(非常實用)

pgdemo13.f  直接看原始碼

可使用雙重的 device,並且其中一個可以作為選單的示範。同一張圖也可以包含多個小圖。

 

pgdemo14.f  直接看原始碼

在圖上提供一個可以編輯輸入參數的欄位給程式

 

pgdemo15.f  直接看原始碼

產生圖之時間、日期以及使用者之資訊的印出

 

pgdemo16.f  直接看原始碼

各類長條圖

 

pgdemo17.f  直接看原始碼

示範 3D 幾何物件之轉動

 

應用範例程式

staticel.f(電力線自動展示程式,需叫用亂數產生器副程式 ran3.f

 

其他資源

使用 PGPLOT 作為繪圖引擎的 SPLASH 天文軟體之 FAQ
http://users.monash.edu.au/~dprice/splash/faq.html

PGplot 的安裝與教學,類似本網站(英文),但有不同範例
http://www.ibiblio.org/pub/linux/docs/LDP/linuxfocus/English/November2002/article268.shtml

關於使用 gif 格式圖檔作輸出的一些資訊
http://www.astro.caltech.edu/~tjp/pgplot/gidriv.html