Gnuplot 是一种免费分发的绘图工具,可以移植到各种主流平台。它可以下列两种模式之一进行操作:当需要调整和修饰图表使其正常显示时,通过在 gnuplot 提示符中发出命令,可以在交互模式下操作该工具。或者,gnuplot 可以从文件中读取命令,以批处理模式生成图表。例如,如果您正在运行一系列的实验,需要每次运行后都查看结果图表;或者当您在图表最初生成很久以后需要返回图表修改某些内容时,批处理模式能力会特别有用。当在 WYSIWIG 编辑器中很难捕获用于修饰图表的鼠标单击事件时,您可以很容易地将 gnuplot 命令保存在文件中,六个月后将其加载到交互式会话中重新执行。
安装:
http://www.gnuplot.info/download.html
运行实例:
之前有运行过MapReduce的job求1993年到2013年之间每年的平均温度,最高温度和最低温度。在3个节点上处理1.2G的数据量总时间是6分钟。本实例没必要用那么都的数据,于是选择2012年的部分气象数据92MB,求每个月的平均温度,最高温度和最低温度。
这里贴上Reduce的代码,其他的Map和Driver类和之前的基本差不多。
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{
long totalNum = 0;
long totalValue = 0;
long maxTemp = Long.MIN_VALUE;
long minTemp = Long.MAX_VALUE;
long avgTemp = 0;
for(IntWritable value: values){
long temperature = value.get();
totalNum ++;
totalValue += temperature;
if(temperature > maxTemp){
maxTemp = temperature;
}
if(temperature < minTemp){
minTemp = temperature;
}
}
avgTemp = totalValue/totalNum;
double avg = (double)avgTemp/(double)10;
double max = (double)maxTemp/(double)10;
double min = (double)minTemp/(double)10;
context.write(key, new Text(String.valueOf(avg) + "\t" + String.valueOf(max) + "\t" + String.valueOf(min)));
}
2012年的平均温度,最高温度,最低温度:
201201 -0.2 24.7 -21.0
201202 -0.9 26.1 -34.0
201203 5.6 30.3 -18.0
201204 5.9 32.0 -19.0
201205 11.4 35.6 -5.0
201206 14.3 39.4 -2.3
201207 17.3 40.0 0.0
201208 15.8 36.7 -18.3
201209 12.0 35.0 -18.0
201210 6.8 30.0 -14.0
201211 4.6 30.0 -11.0
201212 -1.6 26.0 -29.2
输入Gnuplot 脚本来画出2012年每个月份的平均温度,最高温度,和最低温度三条曲线图
gnuplot> set xlabel "Month"
gnuplot> set ylabel "Temperature"
gnuplot> set title "Year(2012) Monthly Temperature"
gnuplot> set xrange[201201:201212]
gnuplot> set xtics 201201,1,201212
gnuplot> plot "temperature.dat" using 1:2 w lp pt 5 title "Avg Temperature", "temperature.dat" using 1:3 w lp pt 6 title "Max Temperature", "temperature.dat" using 1:4 w lp pt 7 title "Min Temperature"