Gnuplot
| 一位華夏公益教科書使用者認為此頁面應該被拆分為主題更窄的較小頁面。 您可以透過將此大頁面拆分為較小的頁面來提供幫助。請確保遵循命名規範。將書籍分成較小的部分可以提供更多關注,並允許每個部分都能做好一件事,這將使每個人受益。 |
gnuplot 是一個命令列驅動的跨平臺繪圖程式。儘管名字如此,它與 GNU 專案無關,也不受 GNU GPL 約束。原始碼許可證是一個免費許可證,但不是複製許可證;“允許修改軟體,但不允許分發完整的修改後的原始碼”。[1]
gnuplot 可以互動使用,批處理模式使用,或嵌入(由指令碼)到另一個程式中,例如GNU Octave。
- 互動使用,執行gnuplot在命令列中。
- 在批處理模式下,執行gnuplot input.plt(其中input.plt是輸入檔案的名稱)在命令列中。
- 在另一個程式中,使用該程式的繪圖功能——gnuplot 將被透明地呼叫。
- 為了在自己的程式中使用,可以透過popen,執行 gnuplot,或者使用包裝 gnuplot 的程式語言庫。這些包裝庫存在於 C、C++(例如 Gnuplot-iostream、gnuplot-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 terminal和output行。
- 以互動方式啟動 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]要為維基媒體生成圖形
- 將您的程式碼儲存在檔案中,最好加上註釋
- 使用高質量(向量圖形)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 在維基百科
- 如何在維基百科文章中建立圖表 中有一節關於 gnuplot
- 《從 Unix 命令列進行 Ad Hoc 資料分析》(Ad Hoc Data Analysis From The Unix Command Line)這本書有一章關於 使用 gnuplot 快速繪圖
- commons
- commons:Category:Gnuplot diagrams 包含許多 gnuplot 圖表的例子,其中許多還附有原始碼。
- 包含 Gnuplot 原始碼的影像
- 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.