几天前,我写了个抓取此博客总访问量(见左下角)信息的脚本,并把它扔到了 crontab 中,每隔20min执行一次。日志格式如下:
2009-05-03 01:50 1620 2009-05-03 02:10 1620 2009-05-03 02:30 1621 2009-05-03 02:50 1622 2009-05-03 03:10 1624
|
虽然人类也可以轻易看懂,不过成百上千行的日志,看起来太累了,也太不直观了。所以急需画张图来分析一下。想到了传说中牛气冲天,无比强大的 gnuplot ,正好可以趁这个机会学一学。
读了下面两个网站的文档,就差不多入门了。
好,可以开始处理我的日志了。
首先,由于 gnuplot 不能直接识别这种格式的时间,我把它转化为自 2009-05-03 00:00 所流逝的分钟数。 Perl 代码如下:
#!/usr/bin/perl
use strict;
my %visit;
open LOG, "/home/sapiens/log/cublog.txt" or die "Can't open cublog.txt: $!";
while(<LOG>) {
chomp;
if (/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}) (\d+)$/) {
my $time = ($1-2009)*365*24*60 + ($2-5)*30*24*60 + ($3-3)*24*60 + $4*60 + $5;
$visit{$time} = $6;
}
}
close LOG;
unlink "cublog.dat";
open WRITE2FILE, ">>", "cublog.dat" or die "Can't write to cublog.dat: $!";
for (sort {$a <=> $b} keys %visit) {
print WRITE2FILE "$_ $visit{$_}\n";
}
close WRITE2FILE;
|
此脚本产生一个 cublot.dat 文件,也就是用于 gnuplot 的数据文件。其格式如下:
110 1620 130 1620 150 1621 170 1622 190 1624
|
接着,就可以用 gnuplot 画图了。 gnuplot 既可以以 interactive 模式运行(逐行输入命令),也可以事先把需要执行的命令写在文件里,加载文件,一次执行多行命令。对于较为复杂的任务,后者明显更为方便。以下是产生 png 图片的脚本(根据不同的需求,我还同时写了产生 eps ,jpeg 格式图片的脚本):
set terminal png font "/usr/share/fonts/TTF/arial.ttf"
set format x "%2.1f" set xtics 0.5 set title "CUBlog Hits Statistics" set xlabel "Days since 05/03/2009 00:00" set ylabel "Total Visits" set time unset key set grid set sample 1000
set output "cublog_lines.png" plot "cublog.dat" using ($1/1440):($2) with lines set output "cublog_lines_fit.png" plot "cublog.dat" using ($1/1440):($2) with lines, 66.1446*x+1628.93 # pause -1 set output "cublog_boxes.png" plot "cublog.dat" using ($1/1440):($2) with boxes
|
在终端中执行 $ gnuplot script_name ,得到三张 png 格式的图片。如下:
1. lines stype
2. lines style + 拟合的直线
3. boxes style
可以选择很多的 style ,我这里用了两个(lines and boxes)。
您可能会问,第二张图里面,绿色的直线代表什么意思?对了,那个就是 gnuplot
拟合出来的直线。gnuplot 具有强大的拟合功能,而且只需两条命令就能完成:
y(x) = a/1440*x + b fit y(x) "cublog.dat" via a,b
|
第一条命令先定义了一个一元一次函数(假设访问量随时间均匀变化),然后我们的目标就是算出斜率和截距来。第二条命令就是用来算 a, b 的。依次执行这两条命令后,得到了 a, b 的值,然后就可以画拟合的直线了。注意画图脚本中红色部分即画拟合直线。
从拟合直线的斜率可以看到,此博客每天的访问量约为66人次。Hmm, 还不错:)
gnuplot 不管是画函数图,还是数据图,2D 的还是 3D 的,都非常方便;功能堪比 Matlab,体积却要比它轻巧 n 倍;而且又是自由软件,我都有一种相见恨晚的感觉!当年写物理实验报告的时候,我咋不知道用它呢?强烈推荐各位使用。以后我要是当数学老师或者物理老师,一定要求学生使用这款软件。不会的全部不及格~嘿嘿
阅读(994) | 评论(0) | 转发(0) |