本次要点:
用时间类型数据作为坐标轴。
说明文件中的数据格式。(比修改间隔符的方法更能应对复杂格式)
选择性提取文件中的数据。
图、轴、曲线的名字。
数据平衡操作。
1,使用时间数据作为x坐标
可以使用:
set xdata time
设置x坐标轴为时间数据,对于其他坐标轴也是一样。
默认格式是 “年/月/日”
可以通过命令:
set timefmt “%Y-%m-%d”
来修改。
具体的格式化字串如下:
格式 | 解释 |
%d | day of the month, 1–31 |
%m | month of the year, 1–12 |
%y | year, 0–99 |
%Y | year, 4-digit |
%j | day of the year, 1–365 |
%H | hour, 0–24 |
%M | minute, 0–60 |
%s | seconds since the Unix epoch (1970-01-01 00:00 UTC) |
%S | second, integer 0–60 on output, (double) on input |
%b | three-character abbreviation of the name of the month |
%B | name of the month |
如果需要取消x轴的时间形式 可以使用:
set xdata
命令来重置。
注意:如果要在所绘制的图像中使用时间信息现实坐标轴,还需要使用:
set format x "%y/%m/%d"
命令还设置在图中显示x轴所用的格式。
对于时间数据,同样可以使用中括号来生产一个range,例如在上面的格式下,可以这样生产一个时间区间:
["2011-01-01":"2011-04-01"]
2,文件中的变量操作(以及格式说明)
其实这种需求对于日期数据做坐标轴的需求主要来自于文件,同样对于文件我们有时候不仅仅是要把某个维度现实出来,还要在现实的时候做一些操作。
basic:
数据文件中的不能随便空行,需要间隔的时候可以使用“#”注释某一行,因为各个空行是有含义的:
单个空行:表示同一个数据集中的不连续处,即单个空行前后的数据,在绘制时不会连起来。
双空行:表示两个数据集的分隔,不同数据集的数据认为是间断的,即使用一条plot语句会对每个数据集各画一条线,而且它们的style都是相同的。
文件一行一个数据条目,一个数据条目里面可以有若干个维度,各个维度之间默认支持可以用空格或制表符隔开。在gunplut的命令里面通过“$x”来引用。gnuplot会自动生成一个伪列“$0”,它的值从0开始,可以理解为表示每个数据在文件中的行号。然后其他数据依次是“$1”、“$2”、“$3”等。当不做操作而直接引用的时候可以直接写0,1,2等。
引用某个维度的时候需要使用using关键字,例如我要显示文件a.txt中的第一列,可以用:
plot 'a.txt' using 1
或
plot 'a.txt' using 0:1
或
plot 'a.txt' using 0:($1)
其中第二种形式表示用伪列0做x轴,而第一种形式默认使用它做x轴,第三种形式是使用变量引用的形式。
数据格式
有时候由于数据格式的问题(尤其是我们常用的CSV格式),gnuplot会无法读入我们的数据(对于CSV格式只能读入第一列),需要我们手动指定数据的输入格式,具体方法是在using x:x之后加入双引号括起来的格式字符串。
例如:
plot 'a.csv' using 1:2 "%lf,%lf"
格式串中的占位符和c语言中一样。(但是不支持%f,即可以理解为没有float而全都是double)。
如果只是要应对CSV格式那么使用小记3(http://blog.csdn.net/yanxiangtianji/article/details/8826801)中“修改间隔符”的方法更方便。
文件过滤
plot 'a.txt' index 3:10:3 using 1:2 with line
表示画第3、6、9个数据集的数据。
plot 'a.txt' every 3 using 2
表示画0、3、6、9、12、……行的数据
every关键字也接受3个参数,表示步长,起始行号,终止行号;注意是用两个冒号隔开而不是1个。
plot 'a.txt' every 3::3::10 using 2
操作各个变量
如果需要对某些维度的值进行计算之后,将它的结构作为要显示的值,那么需要使用$x的形式引用那个列,在using中不能直接让$x与其他值并列出现,至少要有括号包裹。
可以使用函数,或者具体表达式表示某个新的维度。
例如:
plot 'a.txt' using 1:($1*10-$2/3)
#假设已经定义了一个函数fun,它接受3个参数
plot 'a.txt' using 0:fun($1,$2,$1+$2)
3,名字
线的名字:
plot sin(x) title 'my line'
图的名字:
set title 'my graph'
plot sin(x) title 'my line'
坐标轴的名字:
set xlabel 'x-time'
set ylabel 'y-volume'
4,平滑
frequency:和unique不一样,frequency对每个x取统计结果,比如将相同x的多个y值进行求和,因此,这个命令可以统计频率,制作直方图。
bezier:绘制N阶贝赛尔曲线,N为点数。
sbezier:相当于先使用unique排序,消除重复点,然后再使用bezier。
csplines:先使用unique,然后再画三次样条曲线。
acsplines:先使用unique,然后画加权三条样条曲线,权重由using第三个维度指定,即using关键字后面要有3个维度,且权值必须大于0。权值越大越贴近原来的折线,越小越平。
plot 'a.txt' using 1 smooth bszier
replot 'a.txt' using 1 with impulse
replot 'a.txt' using 0:1:2 smooth acsplines