跳轉到內容

Gnuplot

0% developed
來自華夏公益教科書

gnuplot 是一個命令列驅動的跨平臺繪圖程式。儘管名字如此,它與 GNU 專案無關,也不受 GNU GPL 約束。原始碼許可證是一個免費許可證,但不是複製許可證;“允許修改軟體,但不允許分發完整的修改後的原始碼”。[1]

gnuplot 可以互動使用,批處理模式使用,或嵌入(由指令碼)到另一個程式中,例如GNU Octave

  • 互動使用,執行gnuplot在命令列中。
  • 在批處理模式下,執行gnuplot input.plt(其中input.plt是輸入檔案的名稱)在命令列中。
  • 在另一個程式中,使用該程式的繪圖功能——gnuplot 將被透明地呼叫。
  • 為了在自己的程式中使用,可以透過popen,執行 gnuplot,或者使用包裝 gnuplot 的程式語言庫。這些包裝庫存在於 C、C++(例如 Gnuplot-iostreamgnuplot-cpp)、Python、Perl、Java、Fortran95 等等。

作為非常簡單的用法,啟動 gnuplot 並輸入

plot sin(x)
exit

這將顯示正弦函式的繪圖,然後退出。

要繪製函式或函式

  • 定義函式
  • 確定輸入輸出範圍
  • 確定區域圖表樣式
  • 繪製它(使用plot函式)

要繪製資料,請將資料收集到檔案中,而不是定義函式。

純文字

[編輯 | 編輯原始碼]

取消預設裝飾將產生一個完全空白的圖形區域

unset title
unset key
unset xtics
unset ytics
set border 0

如果需要,現在可以單獨設定這些欄位。

座標軸

[編輯 | 編輯原始碼]

百分比

[編輯 | 編輯原始碼]

要將座標軸格式化為百分比,請將數字乘以 100 並使用format新增“%”符號,例如

set format y "%g %%"
plot "dat1.txt" using 1:($2*100)

函式型別

[編輯 | 編輯原始碼]

分段函式

[編輯 | 編輯原始碼]
參見:分段函式


有多種方法。

? 運算子

[編輯 | 編輯原始碼]

可以使用三元條件運算子(?:)在 gnuplot 中繪製分段函式。例如,可以透過以下方式手動定義絕對值函式:

f(x) = x > 0 ? x : -x

將其理解為“如果...那麼...否則”:“如果x大於 0,那麼 否則

可以將這些連結起來,例如:

f(x) = x < 1 ? 1 \
     : x < 2 ? 3 \
             : 5

這對應於分段函式

對於分段函式,您可能需要許多樣本,這樣間斷點就會顯示為垂直線,拐角就會顯得尖銳,所以

set sample 1001

(使用 1001 而不是 1000 可以避免在間斷點上出現樣本點的偽影,這會導致 "階梯狀" 的效果。)

分別繪製每個函式

[edit | edit source]

或者您可以分別繪製每個函式,就像您現在正在做的那樣。

f(x) = a1*x**2+b1*x+c1  for x in [t11,t12]
f(x) = a2*x**2+b2*x+c2  for x in [t21,t22]
f(x) = a3*x**2+b3*x+c3  for x in [t31,t32]
....
....
...

其中

t11<=t12<=t21<=t22, etc.

引數模式

[edit | edit source]

更好的是,切換到引數模式,將公共 t 區間 [0:1] 對映到您各個的 t 範圍,然後

x1(t) = t11+t*(t12-t11) ...

plot x1(t), f1(x1(t)), x2(t), f2(x2(t)), ... 分別繪製每個函式

原始檔

[edit | edit source]

gnuplot 允許您透過以下方式載入檔案load命令,或在命令列中將它們作為引數傳遞。這對於複雜的圖形非常有用。

沒有官方的標準副檔名,但一些半官方的副檔名被使用

  • .plt, .gnu, .gpi,.gih用於一般的 gnuplot 檔案;
  • .dat用於資料;
  • .fnc用於函式定義。

對於格式化原始碼,兩個有用的語法片段是

註釋
井號 (#) 字元開始行內註釋,一直持續到行尾。
行延續
尾隨反斜槓 (\) 是行延續字元,允許您將一個長表示式拆分為多行。您還可以縮排/對齊延續行以提高可讀性(如分段函式),因為初始空格會被忽略。

除錯

[edit | edit source]

要除錯 gnuplot 檔案,通常很有用的是

  • 將終端更改為互動式(而不是輸出到檔案),方法是註釋掉set terminaloutput行。
  • 以互動方式啟動 gnuplot,然後load要除錯的 gnuplot 檔案。
  • 在檔案末尾加上pause -1(暫停直到回車),然後從命令列執行它。
    • 或者,使用-persist命令列開關執行 gnuplot,這樣 gnuplot 會退出,但視窗會保留。
  • 透過 Shebang (#!) 符號使檔案本身可執行(取決於確切的路徑)
#!/usr/bin/gnuplot -persist

語法高亮

[edit | edit source]

vim 只要副檔名為 .gpi,就會自動為 gnuplot 進行語法高亮 (gnuplot.vim)。

或者,其他副檔名,如.plt,可以透過通常的 autocommand 方式新增

au BufNewFile,BufRead *.plt,*.gnuplot setf gnuplot

另請參見與 pathogen 的自動檔案型別檢測功能相容的 github 儲存庫

顏色

[edit | edit source]

colorsequence

[edit | edit source]

語法

   set colorsequence {default|classic|podo}

離線幫助

   help set colorsequence
  • cycle set
 set linetype 1 lc rgb "dark-violet" lw 2 pt 0
   set linetype 2 lc rgb "sea-green"   lw 2 pt 7
   set linetype 3 lc rgb "cyan"        lw 2 pt 6 pi -1
   set linetype 4 lc rgb "dark-red"    lw 2 pt 5 pi -1
   set linetype 5 lc rgb "blue"        lw 2 pt 8
   set linetype 6 lc rgb "dark-orange" lw 2 pt 3
   set linetype 7 lc rgb "black"       lw 2 pt 11
   set linetype 8 lc rgb "goldenrod"   lw 2
   set linetype cycle 8


9 cycle set

# https://stackoverflow.com/questions/46775612/colorsequence-for-more-than-8-colors-gnuplot
# Ethan A Merritt - my preference for gnuplot colors
 # 2 3 4 5 6 8 are borrowed from the colors_podo set
 #
 set linetype  1 lc rgb "dark-violet" lw 1
 set linetype  2 lc rgb "#009e73" lw 1
 set linetype  3 lc rgb "#56b4e9" lw 1
 set linetype  4 lc rgb "#e69f00" lw 1
 set linetype  5 lc rgb "#f0e442" lw 1
 set linetype  6 lc rgb "#0072b2" lw 1
 set linetype  7 lc rgb "#e51e10" lw 1
 set linetype  8 lc rgb "black"   lw 1
 set linetype  9 lc rgb "gray50"  lw 1
 set linetype cycle  9

程式碼

[edit | edit source]
  • gnuplot/src/getcolor.c
  • gnuplot/src/graphics.c
  • gnuplot/src/color.c

生成維基媒體圖形

[edit | edit source]
參見:如何為維基百科文章建立圖表:gnuplot

要為維基媒體生成圖形

  • 將您的程式碼儲存在檔案中,最好加上註釋
  • 使用高質量(向量圖形)SVG輸出。
  • 生成 SVG。
  • 可選地進行後處理。
  • 圖形原始碼上傳到維基媒體公用。

詳細資訊如下。


gnuplot 選項

[edit | edit source]

這是一個示例標題

set terminal svg enhanced size 300 300
set samples 1001  # high quality
set border 31 linewidth .3 # thin border
set output "filename.svg"

(檔名應該更改為更具描述性的名稱,但這並非嚴格必要。)

這將建立一個名義上為 300 × 300 的 SVG,這是維基媒體的常見顯示大小:最容易製作名義大小為預期顯示大小的圖形,但要注意影像可以而且確實被調整大小,這會影響粗細可讀性 - 如果使用較大的名義大小,這樣它很可能會被縮小,請使用大字型粗線。

要注意,對於水平書寫,y 軸標籤很可能比 x 軸標籤佔據更多空間(水平方向),因此名義上是正方形的圖形實際上繪圖區域的高度會略微大於寬度。

您可以透過以下方式設定字型

set terminal svg enhanced size 300 300 fname "Times" fsize 36

技術細節

[edit | edit source]
set terminal svg
將輸出設定為 SVG 檔案
enhanced
表示使用增強的文字輸出,當需要希臘字母時。您可以在 [此處] 找到表格。
size 300 300
將 SVG 的名義大小設定為 300 × 300
set samples 1001
這將設定許多樣本以獲得高質量;1001(而不是 1000)是為了使樣本不太可能直接落在畫素或間斷點上,這會導致混疊。如果您遇到意外混疊,請嘗試將其更改為 1002 或 1003,因為這將移動所有樣本點,可能解決問題。
set border 31 linewidth .3
“31” 在二進位制中是 1111,表示 "所有邊框";使用二進位制中的 "3" (0011) 僅表示下邊框和左邊框。較細的線寬會使邊框不那麼突出,突出了線條。[注意,31 在二進位制中實際上是 11111。第五位與本示例無關,示例應該用 15 代替 31 重寫。] 注意,使用互動式 gnuplot 命令 "help set border" 以檢視有關每一位控制內容的說明。
set output "filename.svg"
這將設定輸出檔名。在正常使用中,選擇一個更能描述檔案內容的檔名。

後處理

[edit | edit source]

您可能希望對 SVG 進行後處理,無論是在 Inkscape 等向量圖形程式中,還是手工進行(因為 SVG 檔案是文字)。這對於新增在 gnuplot 中難以生成的註釋很有用,或者您可以將繪圖作為更大或更復雜圖形的一部分合並。

維基媒體公用上傳

[edit | edit source]
  • 請使用模板{{gnuplot}}將其標記為使用 gnuplot 製作。
  • 原始碼可以包含在說明的 "原始碼" 部分(如果簡短),或者更常見的是包含在單獨的== gnuplot 原始碼 ==部分。
  • 如果原始碼用 語法高亮 包裝,它最具可讀性
<syntaxhighlight lang="gnuplot">
...
</syntaxhighlight>
  • 如果您使用文字,它可能會被翻譯 - 請使用模板{{Translation possible}}以指示可以進行翻譯。
    • 或者,最小化文字的使用(放在單獨的標題中),以便在其他語言中重複使用影像。

設計注意事項

[編輯 | 編輯原始碼]

在圖表設計中,有很多需要考慮的因素,因為圖表被視為資訊圖形。資訊圖形設計師的作品和著作是一個很好的參考資料,例如,愛德華·塔夫特(Edward Tufte)的著作廣受好評:他的《定量資訊的視覺呈現》(The Visual Display of Quantitative Information)與圖表最為相關,但他的作品以及其他人的作品也可以提供啟發和靈感。

第一個要考慮的問題是繪製什麼,以及圖表是否是傳達某些資訊的最佳方式:圖表可能出乎意料地有用,或者相反,圖表可能不是傳達資訊的最佳方式。此外,圖表如何與其他材料連線和整合是一個問題——它是被引用了嗎?被描述和討論了嗎?

作為圖表替代或輔助的其它媒介包括:

  • 文字,可以是正文、列表或獨立的單個專案(摘錄)
  • 表格
  • 示意圖
  • 動畫(可能是動畫圖表)
  • 照片

通常,以多種方式呈現相同資訊是有益的。

第二個問題是使用多少個圖表。

  • 最明顯的是可以使用一個**單個**、大型、詳細的圖表,這在許多情況下是合適的,例如,如果資料的細節很重要。
  • 或者,考慮使用**小倍數**——幾個小的圖表來表達一個觀點,透過重複和變化,類似於書面上的“比較和對比”。
    對齊圖表或將它們放置在網格上尤其有用,這樣眼睛可以輕鬆地在它們之間切換。
    以不同的比例呈現相同的資料也可能很有啟發性;一個簡單的例子是在估算符號中顯示的,其中相同的資料以絕對比例和相對比例顯示。
  • 也可以使用**內聯**圖表,如火花圖。

除了這些一般性考慮之外,還有一些更細緻的問題:

  • 顯示資料範圍是多少?
  • 使用什麼比例?例如,圖表區域的範圍是否應該與資料的範圍一致(最大限度地利用空間),或者範圍是否應該更大,提供上下文?通常,對數比例或對數-對數比例是合適的,但可能令新手讀者感到困惑。
  • 如何區分資料?使用什麼顏色和線型?
  • 如何突出顯示各種資料——不同的線條應該有多粗或多細,文字應該有多大?

其他維基媒體資源

[編輯 | 編輯原始碼]

參考資料

[編輯 | 編輯原始碼]

外部連結

[編輯 | 編輯原始碼]
  • gnuplot 中心 – 首頁
  • domain_coloring(gnuplot)
  • "gnuplot 不常問問題". 存檔於 原始位置 於 2012-10-29。
  • Janert, Philipp K. (2015), 《Gnuplot 實戰,第二版》, Manning 出版社, 紐約, 美國, 第 425 頁, ISBN 978-1-633430-18-1.
  • Phillips, Lee (2012), 《gnuplot 食譜》, Packt 出版社, 第 220 頁, ISBN 184951724X.
華夏公益教科書