>第三章
1. 数据文件中的空行
单个空行:表示同一个数据集中的不连续处,即单个空行前后的数据,在绘制时不会连起来
双空行: 表示两个数据集的分隔。
注释: 和linux中大多数配置文件一样,注释行是以#符号开头,注释行直接被忽略
2. index指令
一个数据文件中可以有多个数据集,用双空行来分割,绘图时用index指定。
plot 'datafile' index 0:5:2 using 1:2 |
index的三个参数分别为: 起始数据集,终止数据集,步长。因此,上面的命令只绘制0,2,4三个数据集。注意,第一个数据集标号为0.起始数据集和终止数据集指定一个区间,但终止行和步长可以省略. 也就是说如果只有一个参数,那么只画那一个数据集;如果有两个参数,画一个区间;如果有三个参数,则只绘该区间内某些数据集。
index是放在using之前的,因为只有指定的数据集,才可以选择列
3. every指令
间断地绘制某些行
plot 'datafile' every 2 using 1:2 |
上面的命令,在数据集中每隔两行进行绘制,也就是绘制0,2,4,...行
every命令也可以指定起始行,终止行和步长,但格式和顺序和index有所不同
plot 'datafile' every 2::1::5 using 1:2 |
上面的命令绘制1,3,5行。显然第一个参数是步长,第二个参数是起始行,第三个参数是终止行。三个参数用::分隔,而后两个两参数可以省略。第一行同样标号为0。
4. smooth指令
smooth指令可以有多个参数,分别是unique,frequency, bezier, sbezier, csplines, acsplines. smooth指令必须置于using指令之后
unique: 先将using选定的数据进行排序(按x), 然后消除重复的点(即x相同的点), 消除的方法是取平均值。
frequency: 和unique不一样,frequency对每个x取统计结果,比如将相同x的多个y值进行求和,因此,这个命令可以统计频率,制作直方图
bezier: 绘制N阶贝赛尔曲线,N为点数
sbezier: 相当于先使用unique排序,消除重复点, 然后再使用bezier
csplines: 先使用unique,然后再画三次样条曲线
acsplines: 先使用unique, 然后画加权三条样条曲线,权重由using第三个参数指定, 如
plot "datafile" using 1:2:($3) smooth acsplines |
权值必须大于0,越大越弯曲,当趋近于0时,得到一条近似直线,用这个方法可以拟合直线。
5. 数学支持
5.1 查看用户定义的函数: help functions
5.2 系统提供的分布函数脚本: 我的在/usr/share/doc/gnuplot-doc-4.2.6/demo/stat.inc, 里面有统计时常用的分布函数,可以这样载入
load '/usr/share/doc/gnuplot-doc-4.2.6/demo/stat.inc' |
5.3 伪随机数生成
伪随机数的生成信赖于两个种子
rand(0) # 生成下一个伪随机数,使用默认的种子
rand(-1) # 重置种子为默认值
rand(x) # 如果x>0, 重置两个种子为x
rand({x,y}) # 如果x,y>0, 重置第一个种子为x, 第二个种子为y
rand函数和其它函数一样,只能用于表达式,直接输入rand(0)是会报错的,但是可以打印出来
5.4 定义常数
直接用等号赋值
f(x)=-x*log(x) gauss(x,m,s)=exp(-0.5*((x-m)/s)**2)/sqrt(2*pi*s**2) binom(n,k) = n!/(k!*(n-k)!) min(a,b) = (ag(x)=sin(a*x) |
定义函数同样很简单,可以看出gnuplot中的表达式也很直观,常用的运算符都支持。注意最后一个函数中用到一个并不存在的变量a,但是不要紧,只要在实际使用的时候指定就行了,比如
即x坐标轴对应的变量,默认情况下是x, 这也是为什么plot sin(x)这样简单的命令可以执行的原因。用户可以自行指定为其它变量
复数1+2i可以表示为
实部函数为real(z), 虚部函数为imag(z)
print sin(z),cos(z),exp(z) |
但是,复数的两个分量只能是常量,而不能是变量或表达式,但是,可以灵活处理
plot real(exp(x*{0,1})), imag(exp(x*{0,1})) |
6. 数据变换
using指令中,一对小括号内是一个表达式。表达式中引用某一列使用$符号。这样,用户就可以比较灵活地对某列或某几列数据进行绘制前的处理。
plot "datafile" using 1:(sqrt($2)) with lines plot "datafile" using (log($1)):(log($2)) with linepoints plot "datafile" using 1:($2+$3) w lp plot "datafile" u 1:($2>0?log($2):0) w l plot "datafile" u 1:(1) smooth frequency w l |
注意,最后一条命令,表达式可以是常量,这条命令相当于绘制直方图。
7. 列操作
每列都是有一个标号的,第一列是1,第0列则表示行号,第-2列则表示数据集的编号。
在数据文件中,每当遇到一个双空行,数据集编号加1,而行号变成0.
column(x)函数相当于$x,但是这里的x可以是一个表达式, 而且对于-2列来说,只能使用column(-2).
valid(x)函数的作用是看x列的当前行数据是否合法。
8. 采样率
在画函数或使用smooth指令时,系统会拟合曲线,这些曲线的采样率由下面的命令指定
注意,采样率在400左右工作地比较好,但不要超过显示区域屏幕的水平分辨率(一般是600),超过水平分辨率不会产生预期的效果的。
9. 裁剪
点和线可能会越过边界,如果取舍,需要裁剪一下。使用set clip命令。
裁剪掉碰到或覆盖边界的点
set clip one或set clip two这两条命令表示什么意思,我没看懂,暂时好像也用不到!==
10. 未定义值
gnuplot支持未定义值,绘图时直接忽略。利用这一点,可以减少绘图时的点的数目,特别是和?:运算符结合起来。
f(x)=abs(x)<1 ? 1 : 1/0 plot f(x) |
11. 对数坐标
当数据呈对数分布时,采用对数坐标是比较好的。没学过的,直接略过吧。
set logscale # both x and y set logscale x # only x set logscale y # only y set logscale y 2 # only y, and set base to 2(default 10) unset logscale unset logscale x unset logscale y |