Design
我也没有体验过其他的数据图绘制软件,反正我觉得 GNUPlot 是有点风格在身上的。
它在命令中使用了大量的缩写,比如说将 help
缩写成 h
,将 title
缩写成 t
,将 using
缩写成 u
将 with
缩写成 w
,将 plot
缩写成 p
,将相同的重复数据用 ""
表示等。这种非常频繁出现的缩写甚至到了模糊语义的地步,我觉得这是为了方便交互式输入。
GNUPlot 是不经常使用 ,
的,而是大量使用空格来隔离参数。
Set/Unset/Show/Reset
总的来说,GNUPlot 的工作流程是用 set
设置一堆的环境变量(在 GNUPlot 中的),然后在利用 plot
绘图, plot
命令会根据自身的参数和之前 set
设置的环境变量来指导绘图的行为。
我们可以用 show
命令来打印环境变量的值。用 unset
表示取消某个环境变量,对应的就是图上不会出现某个元素。
我们使用 reset
命令来让环境变量恢复默认设置。
Help
如果有不懂的,可以使用 help
命令(也可以用 ?
)在交互终端中查询各种东西,但是并不是每次都会成功。其格式为:
help {<topic>}
h {<topic>}
? {<topic>}
在解释完 topic
后,有可能会继续出现 subtopic
的 list 让用户选择继续查看。在查看完后会重新回到 subtopic
的选择界面,但是已经没有 subtopic 的 list 了,我们可以键入 ?
来查看 list 。
Overview
key
: 右上角的图例,在plot
中也可以用title
指定。data
: 绘图所需要的数据,data style
是绘图默认的样式。style
: 绘图的样式,在plot
中使用with
指定,也可以用set style
设置。label
: 坐标轴的名字。tics
: 坐标轴的刻度。range
: 坐标轴的范围using
: 挑选的数据的一部分
Topics
Terminal
terminal
用于文件的输出格式,在论文中我们使用 postscript
格式。不同格式的选项设置也不同,这些选项往往设置了一些全局的属性,对于 postscript
有:
set terminal postscript {landscape | portrait | eps}
{enhanced | noenhanced}
{defaultplex | simplex | duplex}
{fontfile {add | delete} "<filename>"
| nofontfiles} {{no}adobeglyphnames}
{level1 | leveldefault | level3}
{color | colour | monochrome}
{background <rgbcolor> | nobackground}
{dashlength | dl <DL>}
{linewidth | lw <LW>} {pointscale | ps <PS>}
{rounded | butt}
{clip | noclip}
{palfuncparam <samples>{,<maxdeviation>}}
{size <XX>{unit},<YY>{unit}}
{blacktext | colortext | colourtext}
{{font} "fontname{,fontsize}" {<fontsize>}}
{fontscale <scale>}
其中比较重要的有:
eps
: 是一种 postscript 的子格式,适合嵌入 latexenhanced
: 会开启 subscript 等功能color
: 输出彩色文件dashlength
: 唯一一个可以虚线宽度的地方font
: 设置全局字体,注意需要使用 postscript name ,在 FC-List 中可以找到命名格式
Key
如果希望图例出现在非右上角(默认)的位置,应该用的是小写的方位,比如说希望 key 在右下角,有:
set key right bottom offset 0, 2
多出来的 offset
可以用于微调图例的位置。
而如果希望 key 的色块和解释位置调换,那么应该选择 reverse
,如果希望修改解释的对齐方式,那应该用大写的方位,如下所示:
set key reverse Left
Plot
plot 的比较全的格式如下:
plot [<xrange>][<yrange>] \ # 数据范围
<data source> \ # 数据来源,文件或者变量
using <y, x:y> \ # 数据列
axes <x1y1, x1y2, x2y1, x2y2> \ # 使用的坐标轴
title "title-name" \ # key 的名称
with <style> # 样式
我们并不需要对于每个数据都进行一遍相同的设计,有很多设计我们都是通过指定环境变量的方式来全局设定,然后用 plot
的选项来局部特定。比如说 range
我们依赖于全局设定。
using
指定数据列的时候,可以直接指定 tics label ,其写法是:
using 2:xtic(1)
Axes
Tics
用如下命令设置刻度和分刻度:
set ytics 1
set mytics 2
如果希望刻度更加自定义,可以给刻度一个名字(似乎学名叫做 label):
set xtics ("1" 0, "2" 1, "4" 2, "6" 3, "8" 4, "10" 5)
面对过于长的 label ,我们还可以旋转它来节约空间:
set xtics rotate by -25
双轴
基本上就是只要 set
就会显示,非常简单。
set y2label "Throughput(Kbytes/sec)"
set y2range [1:119]
set ytics nomirror # 取消 y 在 y2 上的刻度
Style
Style 有很多中 substyle ,每个 substyle 又有不同的选项。如果在 plot
中,那么格式是:
with histograms fillstyle pattern 7 linecolor rgb "#2878b5"
也就是说,要先指定 substyle ,然后指定对应的选项。
Linespoints
如果希望全局设定,那么会先选择一种样式,比如说 points
, linespoints
, histograms
,设置方式如下:
set style data linespoints
对于线类,可以先设置出具体的样式 linestyle
,然后再在后面的 plot
中引用:
set style line 1 linecolor rgb "#9ac9db" pointtype 4 pointsize 1.5 linewidth 3 dashtype "-"
plot thr using 1:2 title "lat-base" axes x1y1 linestyle 1
Histogram
柱型图主要考虑填充 fill
和边框 border
的风格,其设置如下:
set boxwidth 0.9 relative # 柱型图宽度
set style histogram clustered gap 1 # 柱型图间距
set style fill solid border 0 # 柱型图填充和 border
# pattern 是柱型图 fill 的花纹
plot data using 3:xtic(1) with histograms fillstyle pattern 7 linecolor rgb "#2878b5"
不过我不喜欢 gnuplot 的花纹,它的花纹的背景只能是白色的,而不能是其他颜色,具体讨论见 这里 。