Chinaunix首页 | 论坛 | 博客
  • 博客访问: 85087
  • 博文数量: 16
  • 博客积分: 146
  • 博客等级: 入伍新兵
  • 技术积分: 139
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-29 22:41
文章分类

全部博文(16)

文章存档

2012年(2)

2011年(14)

分类:

2011-11-27 22:14:32

原文地址:gnuplot笔记(三) 作者:pkuwwt

<>第三章

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)是会报错的,但是可以打印出来

print rand(0)

5.4 定义常数
直接用等号赋值

e=2.718

5.5 定义函数

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,但是不要紧,只要在实际使用的时候指定就行了,比如

plot a=1,g(x),a=2,g(x)

5.6 自变量(dummy variable)
即x坐标轴对应的变量,默认情况下是x, 这也是为什么plot sin(x)这样简单的命令可以执行的原因。用户可以自行指定为其它变量

set dummy t
plot sin(t)

5.7 复数
复数1+2i可以表示为

z={1,2}

实部函数为real(z), 虚部函数为imag(z)

print real(z),imag(z)

复变函数中支持的常见函数在gnuplot中也支持

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指令时,系统会拟合曲线,这些曲线的采样率由下面的命令指定

set samples 400

注意,采样率在400左右工作地比较好,但不要超过显示区域屏幕的水平分辨率(一般是600),超过水平分辨率不会产生预期的效果的。

9. 裁剪
点和线可能会越过边界,如果取舍,需要裁剪一下。使用set clip命令。
裁剪掉碰到或覆盖边界的点

set clip points

裁剪穿越边界的线段

set clip one|two

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

阅读(4672) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~