4

gnuplot 学习小计2-时间、文件、数据选择、平滑

 3 years ago
source link: https://blog.csdn.net/yanxiangtianji/article/details/8806802
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本次要点:

用时间类型数据作为坐标轴。

说明文件中的数据格式。(比修改间隔符的方法更能应对复杂格式)

选择性提取文件中的数据。

图、轴、曲线的名字。

数据平衡操作。

1,使用时间数据作为x坐标

可以使用:

set xdata time
设置x坐标轴为时间数据,对于其他坐标轴也是一样。

默认格式是 “年/月/日”

可以通过命令:

set timefmt “%Y-%m-%d”
来修改。

具体的格式化字串如下:

day of the month, 1–31

month of the year, 1–12 

year, 0–99

year, 4-digit

day of the year, 1–365

hour, 0–24

minute, 0–60

seconds since the Unix epoch (1970-01-01 00:00 UTC)

second, integer 0–60 on output, (double) on input

three-character abbreviation of the name of the month

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)中“修改间隔符”的方法更方便。

有的时候不需要使用文件中的所有数据,可以使用一些关键字来过滤一下。注意 它们一般要放在using之前,表示先选择了数据再选择数据中的列。
index关键字,它用于选择数据集,接收1到3个参数,依次表示起始的数据集号(从0开始),终止数据集号,步长,例如:
plot 'a.txt' index 3:10:3 using 1:2 with line
表示画第3、6、9个数据集的数据。
各个数据集内部的数据是一条线,不同数据集是不同的线,但是它们的颜色(style)是一样的。
every关键字,它有1个参数,表示每x个数据取一个(从0开始)。
plot 'a.txt' every 3 using 2
表示画0、3、6、9、12、……行的数据
every关键字也接受3个参数,表示步长,起始行号,终止行号;注意是用两个冒号隔开而不是1个。
plot 'a.txt' every 3::3::10 using 2
表示画第3、6、9行的数据。

操作各个变量

如果需要对某些维度的值进行计算之后,将它的结构作为要显示的值,那么需要使用$x的形式引用那个列,在using中不能直接让$x与其他值并列出现,至少要有括号包裹。

可以使用函数,或者具体表达式表示某个新的维度。

plot 'a.txt' using 1:($1*10-$2/3)
#假设已经定义了一个函数fun,它接受3个参数
plot 'a.txt' using 0:fun($1,$2,$1+$2)

线的名字:

绘图命令后面加title关键字
plot sin(x) title 'my line'

图的名字:

使用set title 命令
set title 'my graph'
plot sin(x) title 'my line'

坐标轴的名字:

使用set xlabel或ylabel命令
set xlabel 'x-time'
set ylabel 'y-volume'
在绘图命令最后加smooth关键字后加方法(和with关键字一样),它相当于自带with line命令,但是它和with关键字不冲突,可以在手动指定with选项。
unique:先将using选定的数据进行排序(按x),然后消除重复的点(即x相同的点),消除的方法是取平均值。
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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK