2016年8月14日 星期日

用 pgfplots 套件繪製數據圖

最近因為工作寫報告的緣故,需要在文件中放入許多測量數據的結果圖。我平常是使用 Gnuplot 繪出圖案後,輸出成 .eps 的檔案格式,再放入 LyX 文件中。但如果一個文件中有非常多的數據圖需要呈現的時候,要一個一個輸出 .eps 檔案也是很麻煩的。因此,我就搜尋看看能否直接在 LyX 中用數據資料繪圖?當然答案是肯定的。只是這些步驟是不是夠簡單而已。

首先我先參考 TikZ & PGF 的參考手冊,裏面的 Plots and Functions 一章提到「如果要使用科學座標軸簡單的繪製函數或圖形的話,可以使用 pgfplots 套件或 (TikZ的) datavisualization 命令」。當然我是比較懶的,不太想另外花時間研究新的 pgfplots 套件。仗著只了解一點點 TikZ 語法的基礎下,決定來研究看看 datavisualization 命令該如何使用?

使用方式很簡單,但我一下子就遇到麻煩了。因為我需要繪製的資料是類似底下這種結構 :
# Time Sensor_A B C
# 
# For demo
0 2 2 2
1 2 2 3
2 3 4 7
3 4 6 11
...




使用 datavisualization 命令很難繪製多行 (column) 資料。而且該套件也不允許檔案內有井字號 (hash mark) 開頭的註解,這個限制讓我必須修改原始測量資料才行。這樣做很麻煩。

因此我決定放棄 datavisualization 套件,改用 pgfplots 套件。 pgfplots 套件的用法就簡單多了。pgfplots 也是基於 TikZ 的套庫,因此只要載入 pgfplots 之後,就會自動載入 tikz 套件庫的。

使用方法先在 LyX 文件設定的前文區(preamble) 設定:
\usepackage{pgfplots}
接著在文件中插入 TeX Code:
\begin{tikzpicture}
       \begin{axis}   
        \addplot table [x index=0, y index=1] {demo2.dat} ;
        \addplot table [x index=0, y index=2] {demo2.dat} ;
        \addplot table [x index=0, y index=3] {demo2.dat} ;
    \end{axis}
\end{tikzpicture}
這樣就可以繪製出最基本的圖案了。另外,在 LyX 中若以「預覽框」包住 tikz 程式碼的部份,就可以直接在 LyX 文件中預覽繪圖結果。這功能非常的方便 :D 如下圖


在 LyX 中以預覽框包住 pgfplots 繪圖程式碼

直接預覽 pgfplots 繪圖結果

基本圖形缺少了一些解說文字及裝飾元件(例如圖例)。參考 pgfplots 的手冊,可以微調輸出的圖案。改變之後的程式碼如下:
\begin{tikzpicture}
       \begin{axis}[ title ={pgfplots Demo Plot},
        xlabel={$x$},
        ylabel={$y$},
        minor y tick num=5,
        minor x tick num=5,
        grid=major,
        legend entries={A, B, C}, 
        enlargelimits=false,
        legend pos=north west,
        ]   
        \addplot table [x index=0, y index=1] {demo2.dat} ;
        \addplot table [x index=0, y index=2] {demo2.dat} ;
        \addplot table [x index=0, y index=3] {demo2.dat} ;
    \end{axis}
\end{tikzpicture}

最終一個簡單排版結果如下:

當然 pgfplots 能做的設定還非常多,更多設定請參考 pgfplots 使用手冊。

附錄

由於我一開始嘗試使用 TikZ 的 datavisualization 命令繪圖,但不成功。在此也紀錄一下其用法。

基本的 datavisualization 套件庫使用方式為:
\usepackage{tikz}
\usetikzlibrary{datavisualization}
接著插入 TeX-Code, 輸入以下的程式碼:
\begin{tikzpicture}
  \datavisualization[scientific axes, %
        all axes={grid}, 
        visualize as smooth line]
        data [ headline={x y},  
              separator=\space,
              read from file=test1.dat];
\end{tikzpicture}

基本的 format=table 的選項,只能夠處理兩個 column 的 data, 因此如果一個檔案內超過兩個 column, 多出的資料沒辦法用 datavisualization 畫出來,必須變成兩個不同的檔案才行。

範例檔案: tikzDemo.tar.gz

沒有留言:

張貼留言