Gnuplot是一个开源的跨平台的图形生成工具,基于命令行的界面,基于状态的特点让其使用非常的简单,本文将具体的介绍如何使用Gnuplot来生成一些运营日报中常见的图形。运营日报一般都是用邮件的形式来发送的,邮件限制了运营日报里的图形无法使用基于javascript和flash的图形库,因为在邮件里无法执行javascript和flash。下面我们步入正题,gnuplot正式登场。
Gnuplot简单示例
直接上图:
这是一个sin(x)曲线,是用下面的命令生成的:
set terminal png size 1000,400
set output "./sin.png"
plot sin(x)
上面提到过gnuplot是基于命令行的,gnuplot的命令分为2种,一种是修改状态的,一种是画图的指令。上面代码的第一行,修改终端类型为png,并且png图片的大小为1000px*400px,gnuplot默认的终端类型是unknown,所以这里我们要指定终端的类型为png。第二行指定png图片的输出路径。第三行是个指令命令,画sin(x)。类似的指令命令还有replot、multiplot等。
在使用gnuplot的过程中,如果对命令有疑问的话,可以通过在gnuplot的命令行界面下输入help来获取帮助信息,比如help set terminal将输出下面的帮助信息:
gnuplot> help set terminal
`gnuplot` supports many different graphics devices. Use `set terminal` to
tell `gnuplot` what kind of output to generate. Use `set output` to redirect
that output to a file or device.
Syntax:
set terminal {<terminal-type> | push | pop}
show terminal
由于帮助信息比较长,这里只截取了最上面的部分。
gnuplot点图
继续我们的gnuplot之旅,这次我们画个点图,这些点取得都是随机数,见下图:
代码如下:
set terminal png font "./msyh.ttf" size 1000,400
set output "./random.png"
set xdata time
set timefmt "%Y-%m-%d %H:%M"
set format x "%H:%M"
set ylabel "随机数" offset graph 0.1,graph 0.57 rotate by 0
set grid
set title "2014-10-13 随机数分布"
plot "./random.data" using 1:3 title ""
由于在这个图中含有中文,因此我们需要指定支持中文的终端字体,这里我们用的是微软雅黑;我们random.data的数据格式是2014-10-13 00:00 9664,一共24 * 60+ 1行(因为最后的一个点也需要一个数据,所以这里一共有1441行的数据),set xdata time指定x轴数据的格式是时间格式,并且random.data文件中的时间格式是"%Y-%m-%d %H:%M"(2014-10-13 00:00),但显示的时候只需要小时和分钟的数据,这个通过set format x "%H:%M"来指定x轴日期显示的格式;下一行set ylabel设置y轴坐标的名称;set grid显示网格;set title指定标题;最后一行用random.data的第一列和第三列来生成图形(时间占了两列)。非常简单是不是,下面我们再看下其它的图形样式。
gnuplot24小时曲线
在运营日报中,我们通常需要画24小时的曲线,比如游戏的在线人数曲线,登录/登出用户数曲线,QPS曲线等,见下图:
这类折线图具有简洁清晰的特点,比如在上图中,我们可以很明显的看到在12:00这个时刻有个突起。画这类图形的代码如下:
set terminal png font "./msyh.ttf" size 1000,400
set output "./day_single_line_20141013.png"
set xdata time
set timefmt "%Y-%m-%d %H:%M"
set format x "%H:%M"
set ylabel "QPS (个)" offset graph 0.1,graph 0.57 rotate by 0
<span style="color:#FF0000;">set xtics 7200</span>
set grid
set title "2014-10-13 某数据曲线"
plot "./day_single_line_20141013.data" using 1:3 title "" <span style="color:#FF0000;">with lines</span>
这个图形和上一个很类似,关键的地方我已用红色标出:set xtics 7200设置网格的x轴间隔2个小时;with lines指定我们要画的是折线图。
gnuplot24小时对比曲线
有时候我们想拿今天的运营情况和昨天做个对比,其实这个很简单:
对应的代码如下:
set terminal png font "./msyh.ttf" size 1000,400
set output "./day_double_line_20141013.png"
set xdata time
set timefmt "%Y-%m-%d %H:%M"
set format x "%H:%M"
set ylabel "QPS (个)" offset graph 0.1,graph 0.57 rotate by 0
set xtics 7200
set grid
set title "某数据曲线"
<span style="color:#FF0000;">set key right top</span>
plot "./day_double_line_0_20141013.data" using 1:3 title "2014-10-13" with lines, "./day_double_line_1_20141013.data" using 1:3 title "2014-10-14" with lines
set key right top指定曲线的名称位置为右上角;注意最后一行plot,直接画了2条曲线。
gnuplot24小时双坐标曲线
一张图中画两条曲线,可以让图承载更多的信息,但有时候这两个图的数据相差很大,如果放到同一个坐标轴的话,必然会有一条曲线效果不明显。gnuplot24小时双坐标曲线应运而生,见下图:
如上图,左边是QPS曲线,右边是成功率曲线,perfect!代码如下:
set terminal png font "./msyh.ttf" size 1000,400
set output "./day_double_line_different_axes_20141013.png"
set xdata time
set timefmt "%Y-%m-%d %H:%M"
set format x "%H:%M"
set ylabel "QPS (个)" offset graph 0.1,graph 0.57 rotate by 0 textcolor lt 1
set y2label "成功率 (%)" offset character -7,graph 0.57 rotate by 0 textcolor lt 2
set ytics textcolor lt 1
set y2tics textcolor lt 2
set y2range [0:110]
set xtics 7200
set grid
<span style="color:#FF0000;">set border 31-8-2 lt -1
set object 1 rectangle from graph 0.998,graph 0 to graph 1,graph 1 lw 1 fs empty border lc lt 2
set object 2 rectangle from graph 0,graph 0 to graph 0.002,graph 1 lw 1 fs empty border lc lt 1</span>
set title "2014-10-13 某数据曲线"
set key right top
plot "./day_double_line_0_20141013.data" using 1:3 title "QPS" with lines axes x1y1, "./day_double_line_0_20141013_200.data" using 1:3 title "成功率" with lines axes x1y2
注意红色的代码,第一行是设置不显示左边和右边的border(为什么是31-8-2请参考帮助文档help set border);第二行和第三行分别画后边和左边的border(其实是一个宽度很小矩形)。
Okay,24小时的曲线我们就讲到这里,下面我们来看下月度曲线,比如最近一个月的每天登录人数曲线。
gnuplot月度曲线
请忽略图形中的数据~~这里的数据是楼主随手写的,所以曲线有点奇怪。代码如下:
set terminal png font "./msyh.ttf" size 1000,400
set output "./month_single_line_20141013.png"
set xdata time
set timefmt "%Y-%m-%d"
set format x "%m-%d"
set ylabel "某数据 (个)" offset character 7,graph 0.57 rotate by 0
#set xtics 172800
set xtics "2014-09-13",259200
set xrange ["2014-09-13":"2014-10-13"]
#set yrange [0:]
set grid
set title "2014-10-13 某数据曲线"
plot "./month_single_line_20141013.data" using 1:2 title "" with lines
gnuplot其它的月度曲线和24小时曲线类似,这里我就不多说了,感谢您的阅读,欢迎评论,谢谢。