如何画Flot折线图

html-css011

如何画Flot折线图,第1张

绘图用到的档案

制综合图(折线和柱形图)时,所有需要的档案清单如下.

<script type="text/javascript" src="/js/jquery-1.8.3.min.js"></script>

<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="/js/flot/excanvas.min.js"></script><![endif]-->

<script type="text/javascript" src="/js/flot/jquery.flot.js"></script>

<script type="text/javascript" src="/js/flot/jquery.flot.time.js"></script>

<script type="text/javascript" src="/js/flot/jquery.flot.axislabels.js"></script>

<script type="text/javascript" src="/js/flot/jquery.flot.symbol.js"></script>

建立数据

这个范例用了气象数据当数据,有温度、风速及大气压力.一开始我们先建立3个数组变量分别代表为温度、风速及大气压力,接着再插入数据,x轴我们用的是时间格式数据,我们建立了一个自定义函式gd(),用来取得timestamps,而y轴就是气象数据数据.

//temp

var data1 = [

[gd(2012, 1, 1), 1], [gd(2012, 1, 2), -2], [gd(2012, 1, 3), -2], [gd(2012, 1, 4), 1], [gd(2012, 1, 5), 3], [gd(2012, 1, 6), 4], [gd(2012, 1, 7), 5], [gd(2012, 1, 8), 6], [gd(2012, 1, 9), 7], [gd(2012, 1, 10), 7], [gd(2012, 1, 11), 6], [gd(2012, 1, 12), 7], [gd(2012, 1, 13), 8], [gd(2012, 1, 14), 8], [gd(2012, 1, 15), 3], [gd(2012, 1, 16), 2], [gd(2012, 1, 17), 4], [gd(2012, 1, 18), -1], [gd(2012, 1, 19), 5], [gd(2012, 1, 20), 6], [gd(2012, 1, 21), -2], [gd(2012, 1, 22), -7], [gd(2012, 1, 23), -9], [gd(2012, 1, 24), -8], [gd(2012, 1, 25), -7], [gd(2012, 1, 26), -6], [gd(2012, 1, 27), -3], [gd(2012, 1, 28), 1], [gd(2012, 1, 29), 6], [gd(2012, 1, 30), 9], [gd(2012, 1, 31), 8]

]

//wind

var data2 = [

[gd(2012, 1, 1), 11], [gd(2012, 1, 2), 9], [gd(2012, 1, 3), 7], [gd(2012, 1, 4), 13], [gd(2012, 1, 5), 11], [gd(2012, 1, 6), 11], [gd(2012, 1, 7), 9], [gd(2012, 1, 8), 10], [gd(2012, 1, 9), 7], [gd(2012, 1, 10), 11], [gd(2012, 1, 11), 7], [gd(2012, 1, 12), 6], [gd(2012, 1, 13), 4], [gd(2012, 1, 14), 5], [gd(2012, 1, 15), 11], [gd(2012, 1, 16), 8], [gd(2012, 1, 17), 9], [gd(2012, 1, 18), 16], [gd(2012, 1, 19), 11], [gd(2012, 1, 20), 18], [gd(2012, 1, 21), 8], [gd(2012, 1, 22), 17], [gd(2012, 1, 23), 11], [gd(2012, 1, 24), 13], [gd(2012, 1, 25), 11], [gd(2012, 1, 26), 11], [gd(2012, 1, 27), 9], [gd(2012, 1, 28), 8], [gd(2012, 1, 29), 7], [gd(2012, 1, 30), 8], [gd(2012, 1, 31), 20]

]

//sea level pressure

var data3 = [

[gd(2012, 1, 1), 1012], [gd(2012, 1, 2), 1018], [gd(2012, 1, 3), 1020], [gd(2012, 1, 4), 1016], [gd(2012, 1, 5), 1022], [gd(2012, 1, 6), 1023], [gd(2012, 1, 7), 1029], [gd(2012, 1, 8), 1030], [gd(2012, 1, 9), 1029], [gd(2012, 1, 10), 1034], [gd(2012, 1, 11), 1034], [gd(2012, 1, 12), 1023], [gd(2012, 1, 13), 1022], [gd(2012, 1, 14), 1026], [gd(2012, 1, 15), 1027], [gd(2012, 1, 16), 1023], [gd(2012, 1, 17), 1019], [gd(2012, 1, 18), 1032], [gd(2012, 1, 19), 1029], [gd(2012, 1, 20), 1017], [gd(2012, 1, 21), 1015], [gd(2012, 1, 22), 1017], [gd(2012, 1, 23), 1023], [gd(2012, 1, 24), 1024], [gd(2012, 1, 25), 1024], [gd(2012, 1, 26), 1022], [gd(2012, 1, 27), 1031], [gd(2012, 1, 28), 1023], [gd(2012, 1, 29), 1019], [gd(2012, 1, 30), 1008], [gd(2012, 1, 31), 993]

]

function gd(year, month, day) {

return new Date(year, month - 1, day).getTime()

}

再来就是把数据整理出来,我们建立一个叫做dataset的数组变量,并且插入3个对象分别代表上述提到的3个气象数据数据,在label属性分别设定成"Sea Level Pressure"、"Wind Speed"及"Temperature",在这里我们把Sea Level Pressure数据以柱形图呈现,所以要设定bars.show为true,并设定bars.barWidth,barWidth在这里因为我们是用时间格式数据,所以是以毫秒计算,而我们的数据间隔为1天,所以应该设定成24 * 60 * 60 * 600(乘以600而非1000是因为要让直条间有间距出来).

另外在WindSpeed数据对象里,因为我们要用折线图呈现,所以设定lines.show为true,另外也设定了数据点的属性points.symbol为"triangle",表示数据点符号为三角形,以及points.fillColor表示数据点要以什么颜色填满.而Temperature与Wind Speed数据对象设定是一样的.我们还在3组数据对象里都设定了不同的color属性,这样这3组数据就会以不同颜色呈现.

最后也是最重要的,因为我们要在一张图表里放上3组数据,所以y轴会出现3组刻度,这时就需要设定yaxis属性,在WindSpeed数据对象里可以看到我们设定了yaxis:2,表示WindSpeed是属于y轴第2组的,而Temperature数据对象里我们设定了yaxis:3,表示Temperature是属于y轴第3组的,不过,再回头去看Sea Level Pressure数据对象里我们并没有设定yaxis属性,这是因为Sea Level Pressure是属于y轴第1组的,若是第1组的则可以省略.yaxis属性跟等下我们要讲到的图表选项有很大的关系,下面会提到.

完整的dataset程序代码如下.

var dataset = [

{

label: "Sea Level Pressure",

data: data3,

color: "#756600",

bars: {

show: true,

align: "center",

barWidth: 24 * 60 * 60 * 600,

lineWidth:1

}

}, {

label: "Wind Speed",

data: data2,

yaxis: 2,

color: "#0062FF",

points: { symbol: "triangle", fillColor: "#0062FF", show: true },

lines: {show:true}

}, {

label: "Temperature",

data: data1,

yaxis: 3,

color: "#FF0000",

points: { symbol: "circle", fillColor: "#FF0000", show: true },

lines: { show: true }

}

]

建立图表选项

由于我们x轴是时间格式数据,所以xaxis.mode必须设定为"time",而xaxis.tickSize: [3, "day"]是表示刻度是以每3天的间隔显示,另外因为这范例中会出现柱形图,所以我们设定xaxis.tickLength为0,让x轴的刻度线不要显示,接着xaxis.axisLabel则是轴卷标的属性,最后再设定xaxis.color为"black",让刻度卷标以黑色显示.

xaxis: {

mode: "time",

tickSize: [3, "day"],

tickLength: 0,

axisLabel: "Date",

axisLabelUseCanvas: true,

axisLabelFontSizePixels: 12,

axisLabelFontFamily: 'Verdana, Arial',

axisLabelPadding: 10,

color: "black"

}

而y轴选项的部份是这个范例里的重点,这部份没设定好,你所绘制出来的图表可能就会乱七八糟.

一般来说只有1组数据的图表,只会有一个y轴刻度,如果我们要设定y轴的选项,就会用yaxis:{},而在这个范例里,我们用了3组数据,所以会出现3个y轴刻度,如果要设定y轴的选项时就必须改用yaxes:[]来代替,而数组中的第一个对象就代表在dataset里yaxis:1的对应,第二个对象就代表在dataset里yaxis:2的对应,依此类推.

默认y轴的刻度卷标都会出现在图表的左边,但这次我们有3个y轴的刻度卷标,都显示在左边会造成用户在看图表时的不易解读,所以我们要把2个刻度标签移到右边去,要达到这样的效果可以设定axis.position,可用的值有"left"和"right",另外我们也设定了axis.color为"black",让刻度卷标的文字都以黑色显示,当然我们还另外设定了轴标签(axisLabel).

最后我们在第一个对象里设定了max:1070,因为这对象是Sea Level Pressure的柱形图,如果没设定最大值的话,柱形图就会和其它2个折线图重迭,造成图表不易解读,所以我们设定了1070让柱形图保持显示在中间下方的地方,这样图表就会清爽多了.

y轴选项的程序代码如下.

yaxes: [

//yaxis:1

{

position: "left",

max: 1070,

color: "black",

axisLabel: "Sea Level Pressure (hPa)",

axisLabelUseCanvas: true,

axisLabelFontSizePixels: 12,

axisLabelFontFamily: 'Verdana, Arial',

axisLabelPadding: 3

},

//yaxis:2

{

position: "right",

clolor: "black",

axisLabel: "Wind Speed (km/hr)",

axisLabelUseCanvas: true,

axisLabelFontSizePixels: 12,

axisLabelFontFamily: 'Verdana, Arial',

axisLabelPadding: 3

},

//yaxis:3

{

position: "right",

color: "black",

axisLabel: "Temperature (°C)",

axisLabelUseCanvas: true,

axisLabelFontSizePixels: 12,

axisLabelFontFamily: 'Verdana, Arial',

axisLabelPadding: 3

}

]

在图例的选项里我们设定了legend.noColumns为1,这样图例就会显示成一行,如果设定为0就会显示成一列,而legend.labelBoxBorderColor则设定了图例边框的颜色,再来就是legend.position我们设定成"nw"就是"north west",也就是左上角的意思.所以图例会显示在左上角.

网格的部份,我们设定了grid.hoverable为true,因为我们有使用提示框的功能,设定hoverable后,"plothover"事件才会被触发,提示框才会在我们鼠标移过数据点时显示.而grid.borderWidth则是图表边框的宽度,grid.backgroundColor则是设定背景颜色.

legend: {

noColumns: 1,

labelBoxBorderColor: "#000000",

position: "nw"

}

grid: {

hoverable: true,

borderWidth: 3,

backgroundColor: { colors: ["#ffffff", "#EDF5FF"] }

}

建立数据点提示框

提示框的作用是当你把鼠标移到图表上的数据点时,提示框会显示该数据点的详细数据,如x轴数值或y轴数值等,Flot的提示框必须自己实作出来.

首先我们必须绑定"plothover"事件,此事件会传入item对象,而我们所需要用到的数据都可以从这对象里抓出来,如item.series.label可抓出该数据点的标签名称,而item.datapoint可抓出x及y轴的数值等等,详细的提示框程序代码如下.

var previousPoint = null, previousLabel = null

$.fn.UseTooltip = function () {

$(this).bind("plothover", function (event, pos, item) {

if (item) {

if ((previousLabel != item.series.label) || (previousPoint != item.dataIndex)) {

previousPoint = item.dataIndex

previousLabel = item.series.label

$("#tooltip").remove()

var x = item.datapoint[0]

var y = item.datapoint[1]

var color = item.series.color

var date = "Jan " + new Date(x).getDate()

var unit = ""

if (item.series.label == "Sea Level Pressure") {

unit = "hPa"

} else if (item.series.label == "Wind Speed") {

unit = "km/hr"

} else if (item.series.label == "Temperature") {

unit = "°C"

}

showTooltip(item.pageX, item.pageY, color,

"" + item.series.label + "

" + date +

" : " + y + " " + unit + "")

}

} else {

$("#tooltip").remove()

previousPoint = null

}

})

}

function showTooltip(x, y, color, contents) {

$('<div id="tooltip">' + contents + '</div>').css({

position: 'absolute',

display: 'none',

top: y - 40,

left: x - 120,

border: '2px solid ' + color,

padding: '3px',

'font-size': '9px',

'border-radius': '5px',

'background-color': '#fff',

'font-family': 'Verdana, Arial, Helvetica, Tahoma, sans-serif',

opacity: 0.9

}).appendTo("body").fadeIn(200)

}

完成绘图

最后我们再呼叫$.plot把上面建立的dataset以及options带入,再呼叫UseTootip()后,整个绘图即完成.本范例完整的javascript程序代码可以在这里下载,有兴趣的可以下载回去研究看看.

$(document).ready(function () {

$.plot($("#flot-placeholder"), dataset, options)

$("#flot-placeholder").UseTooltip()

})

武器装备效能评估系统

武器装备效能评估系统是为解决武器装备效能评估问题新研发的一款软件,武器装备效能评估系统用于武器装备论证、研制、试验、使用等不同阶段的效能评估,武器装备效能评估系统为作战体系、装备体系评价和优化提供定量依据。武器装备效能评估系统能够使用仿真、靶试、演习等多种来源的实验数据,将效能评估贯穿武器装备全生命周期。

1武器效能评估系统介绍

武器装备效能评估系统是为解决武器装备效能评估问题新研发的一款软件,武器装备效能评估系统用于武器装备论证、研制、试验、使用等不同阶段的效能评估,武器装备效能评估系统作为作战体系、装备体系评价和优化提供定量依据。武器装备效能评估系统能够使用仿真、靶试、演习等多种来源的试验数据,效能评估贯穿武器装备全生命周期。

北京软件开发武器装备效能评估系统主要包括以下特点:

1、支持实时评估

3、支持专家在线打分

4、集成化评估环境

5、友好易用的图形化界面

6、多种形式的评估结果展示

7、支持用户自定义评估算法

8、提供包含81中算子的指标计算流程编辑工具

9、所及即所得指标体系、评估方案、评估流程设计

10、系统支持32/64位的Windows XP/Windows 7,以及麒麟国产化操作系统。

2系统架构

2.1功能架构

武器效能评估系统主要包括评估工程管理、指标体系管理、评估任务管理、数据处理、评估预算、报告生成和资源管理7大模块,具体的功能架构图如下:

2.2技术选型

武器效能评估系统采用QT进行开发,可以实现跨平台(支持Windows/Linux系统),具体的技术选型如下:

2.3技术架构

武器效能评估系统使用MVC架构进行开发,界面采用Widgets、Window开发窗体,样式使用StyleCss进行开发,饼图、柱状图、折线图等图形的开发使用QtCharts组件,具体的技术架构图如下:

技术架构图

3功能需求

3.1评估工程管理

评估工程管理为效能评估提供统一的资源管理平台,可快速检索和显示各资源的关键属性,并且能够启动选择的资源编辑工具进行编辑。评估工程管理工具支持评估工程的创建、删除及工程项目的查看操作。

支持评估工程的新建、支持评估工程的显示及打开、支持评估工程的删除、支持评估工程的关闭、支持评估工程的查找、支持评估工程的保存。

一个评估工程包括指标体系、评估方案、评估任务和数据聚集。

评估工程管理

3.2指标体系管理

指标体系管理模块负责指标体系的创建、编辑与保存。指标体系是通过对同一类评估对象各种特性逐层抽取,而得到的描述指标间的依赖关系的有向图。该模块支持

成本型、效益型、固定型、偏离型四种

类型的指标的可视化创建与编辑构建指标体系过程中支持层次分析法、环比系数法、熵权法、离差最大化法、自定义权重五种权重设定方法。

支持指标体系的新建、支持指标体系的编辑、支持指标体系的删除、支持指标体系聚合流程的设置、支持指标体系聚合流程的删除。

指标体系管理

层次分析法去权重计算界面

3.3评估任务管理

评估任务管理负责对评估任务的创建、编辑与保存。评估任务是指采用统一的评估方案对一个或多个相关评估对象进行一次评估的过程。创建评估任务首先需要设定评估对象和评价等级,而后通过配置评估流程中的算子参数,将数据预处理获得的数据输入给评估流程。

支持评估任务的新建、编辑、删除支持评估模板的创建、支持评估模板中评估实例的删除、新建及评估实例的对比。

评估任务管理

3.4数据处理功能

评估数据预处理功能主要对各种来源的评估数据进行分组、过滤、归并、属性压缩变换、以及数据统计计算,获得能够供各类效能评估算法使用的数据。数据预处理 模

块可以对一系列数据源和数据集进行管理。

支持数据源的导入、支持数据源处理、支持底层指标数据的预览。

数据预处理编辑

3.5评估运算功能

支持计算检查、支持评估计算、支持评估结果显示、支持效能指标评估结果的存储。

提供常用27类常用算法提供算法向导,方便用户直接采用各类算法进行计算。具体方法包括:层次分析法、模糊综合法、灰色白化权函数聚类、TOPSIS法、 趋

势面分析、数据包络法、主成分分析法、极差分析、方差分析、主成分分析、因子分析、支持向量机、环比系数法、ADC法、SEA法、数据一致性分析、平滑滤

波法、窗谱分析法、最大熵谱分析、一元拟合法、点估计、单总体区间估计、两个总体区间估计、单总体假设检验、两个总体假设检验、偏度和峰度检验、正态性检

验、奇异值过滤。

查看评估任务

3.6报告生成功能

支持评估结果的对比分析、支持灵敏度分析功能、支持报告自动生成功能。

灵敏度分析

3.7资源管理功能

支持算子管理、支持数据集模板管理。