写毕业论文的后遗症——Gnuplot成瘾

论文还没写完,但我已经确信留下后遗症了——用Gnuplot上瘾了。四月份开始准备毕业论文材料,把之前发表的论文里的数据图用Gnuplot重做了一遍。那之后慢慢染上了Gnuplot强迫症——所有的图都要用Gnuplot来画,不然就觉得不舒服。其实Gnuplot主要是绘制数据和函数图,其长处在于所有的元素都可以定制。调整title、tics,加入各种各样的label,还有丰富的输出终端,这些对于绘制整齐美观的数据图非常有用。但数据处理能力不是Gnuplot的强项。7月份就曾纠结在一张彩色镶嵌图上好几个小时。最近论文写作进入了最后的攻坚阶段,Gnuplot的使用频率增加了,于是强迫症也加重了。

昨天想要绘制一个算法示意图。概念很简单,大圆柱中间画一个蓝色的扁圆柱。用基本的3D制图软件,如在学校学过的CAD制图,或者语言类的Povray,都可以完成。可是,我要用Gnuplot!这个过程中遇到的问题在于如何给那个扁圆柱加上想要的颜色。定义一个调色板,然后splot附带pm3d参数。可是画出来的颜色常常不是蓝色,而且不固定。原因是定义调色板的时候,我为了省事,只给了一个数值对应的颜色。例如1对应蓝色,然后把想要涂上蓝色的物体赋值为1。Gnuplot的调色板似乎是全智能的,总把自己的取值范围缩放到实际数据的范围上去。只给调色板一个数值,缩放后该数值对应的颜色就不可预料了。解决方法自然就是再在调色板里定义另一个数值对应的颜色。

 phi_roi_depth

今天要绘制一张分布图。我想起《Gnuplot in Action》那本书里提到过如何用Gnuplot直接将原始数据做成分布图。Gnuplot本身在smooth参数下预制了一个频率模式,把原始数据作为x,y数值为考虑归一化和bin大小后一个事件对应的频率,如此就能绘制出分布图。很方便。这步做完我又不满足,想要把同均值和均方差的正则分布画上去。问题,均方差如何计算呢?算方差还要打开Matlab、Octave这类大型软件岂不牛刀杀跳蚤,而且用基本的shell script足能完成。这时我却想起了awk。awk和sed的强大我早有耳闻,一直没有心情和时间来入门。这时突然兴起,打算用awk来计算。折腾了一番,用了一行awk脚本一揽子解决了均值和方差的计算。在Gnuplot脚本里用system函数调用awk脚本,读取输出,拿来画正则分布。结论,awk和Gnuplot的组合可以应付矩阵数据的基本处理和绘图了。

phi_3d_evl

Gnuplot之所以吸引我是因为其本身就是一种程序语言,而语言的生成结果又是直观的图形,所以用起来就像是一个玩具。每绘制一张图都是在用这个玩具的种种功能组合出期望的图片效果。确实容易沉浸其中难以自拔。新来的伊朗大姐就被我的强迫症所感染,这两天玩Gnuplot玩得不亦乐乎。我清楚地知道这个绘图的习癖已经改不掉了 🙂

Advertisements
  1. #1 by liujunwei on 2014年04月10日 - 06:41

    可否指点一下如何使用awk和gnuplot来做正态分布?谢谢

    • #2 by Recko on 2014年04月10日 - 22:28

      你好,
      当时我是把awk的相关步骤写在一个脚本里,然后在gnuplot的脚本里用system函数调用awk运行这个脚本,如下:
      system_string=’awk -f awk的脚本文件 数据文件’
      之后执行这个命令:
      temp=system(system_string)
      得到的结果被存入temp。temp是一个字符串,字符串的格式是有awk脚本自己定义的。我用关键词”var=”标识方差,”mean=”标识均值。所以之后就可以用gnuplot自带的word,substr这类的字符串处理函数取出数值结果,然后拿来放到正则分布函数里画图。

      awk脚本只有一行,如下:
      {FNR==4;var+=$2 * $2;mean+=$2;next}END{print “mean=” mean/NR, “var=” var/NR}

      FNR==4与我的数据文件结构有关,是为了跳过开头的一些字符。大概就是这样用法。

      这里var表示方差,其实只是数据的平方和;mean只是数据的和。需要将这个两个数除以数据长度才是需要的结果。这一步除法我是用wc取出数据长度(文件行数),然后在gnuplot里操作的。

      说实话,如果没用过awk,也不是特别有兴趣,这种方法可能显得有点nerdy。

      • #3 by junwei on 2014年04月11日 - 03:51

        非常感谢你详细的回复,我明白你是怎么做的了,回去我按照自己的数据格式改一下。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: