免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1804 | 回复: 0
打印 上一主题 下一主题

Gnuplot 小试 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-07 19:27 |只看该作者 |倒序浏览
几天前,我写了个抓取此博客总访问量(见左下角)信息的脚本,并把它扔到了 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 ,正好可以趁这个机会学一学。
读了下面两个网站的文档,就差不多入门了。
  • http://dsec.pku.edu.cn/dsectest/dsec_cn/gnuplot/index.html
  • http://darksair.org/wiki/Gnuplot.html好,可以开始处理我的日志了。
    首先,由于 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 倍;而且又是自由软件,我都有一种相见恨晚的感觉!当年写物理实验报告的时候,我咋不知道用它呢?强烈推荐各位使用。以后我要是当数学老师或者物理老师,一定要求学生使用这款软件。不会的全部不及格~嘿嘿


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93312/showart_1921563.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP