Chinaunix首页 | 论坛 | 博客
  • 博客访问: 81724
  • 博文数量: 31
  • 博客积分: 2048
  • 博客等级: 大尉
  • 技术积分: 353
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-24 22:28
文章分类

全部博文(31)

文章存档

2011年(1)

2009年(30)

分类: LINUX

2009-05-07 19:27:14

几天前,我写了个抓取此博客总访问量(见左下角)信息的脚本,并把它扔到了 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) |
0

上一篇:大学的尾巴

下一篇:毕业论文大功告成!

给主人留下些什么吧!~~