flot - jQuery 图表插件(jquery.flot)使用
Flot是纯Javascript实现的基于jQuery的图表插件,主要支持线状图和柱状图的绘制(通过插件也可以支持饼状图)。
它的特点是使用简单、图形美观,支持鼠标跟踪及缩放功能。
Flot是基于canvas进行图表的绘制,可以在IE6+/Firefox2+/Safari3+/Opera9.5+/Chrome等主流浏览器上运行;其中IE9以下浏览器不支持canvas标记,需要额外引用excanvas库(VML)来实现。

基本使用
首先,在页面头部引用脚本:
| 1 2 3 | <!--[iflte IE 8]><script src="js/excanvas.min.js"></script><![endif]--><script src="js/jquery.min.js"></script><script src="js/jquery.flot.min.js"></script> | 
在页面中创建一个html标记,如div,然后通过样式来指定图表的大小:
| 1 | <divid="placeholder" style="width:600px;height:300px;"></div> | 
最后,在DOM Ready事件中调用Flot的绘制方法$.plot:
| 1 2 3 | $(function() {    $.plot($("#placeholder"), [[[0, 0], [1, 2]]]);}); | 
这样就简单的绘制了一条线。
数据格式
flot的数据格式是数组,数组中包含多个系列的数据,每个系列的数据对应一条线:
| 1 | [ series1, series2, ... ] | 
每一个系列的数据可以是一个数组或者对象。
数组格式的数据,每一个点都是一个数组(分x/y轴):
| 1 | [ [x1, y1], [x2, y2], ... ] | 
如下定义了三个点:
| 1 | [ [1, 3], [2, 14.01], [3.5, 3.14] ] | 
绘制图表的时候,会把这三个点连接起来;假如中间有个点使用了空值即null,这个点的两边则不会连接起来:
| 1 | [ [1, 3], [2, 14.01], null, [3.5, 3.14], [5, 8] ] | 
需要注意的是,每个点的数据必须是数字,如果是字符串,可能会得到奇怪的错误。
对象格式的数据,如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | {    color: color or number  //颜色,如果不设置会自动生成    data: rawdata //数据    label: string //用于图例说明    lines: specific lines options    bars: specific bars options    points: specific points options    xaxis: number    yaxis: number    clickable: boolean    hoverable: boolean    shadowSize: number    highlightColor: color or number} | 
通常不需要关心其他选项,只需要指定label和data:
| 1 2 3 4 | {    label: "y = 3",    data: [[0, 3], [10, 3]]} | 
对象格式的数据提供更大的灵活性,也更有利于代码的可读性,如下定义了两个系列即两条线:
| 1 2 3 | [ { label: "Foo", data: [ [10, 1], [17, -14], [30, 5] ] },  { label: "Bar", data: [ [11, 13], [19, 11], [30, -7] ] }] | 
选项设置
所有的选项都是可选的,改变某个属性,只需要指定特定的属性名称:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | {  // 自定义数据系列  series: {    //共有属性:点、线、柱状图的显示方式    lines, points, bars: {          // 是否显示          show: boolean          // 线宽度          lineWidth: number          // 是否填充          fill: boolean or number          // 填充色,如rgba(255, 255, 255, 0.8)          fillColor: nullor color/gradient      }      // 只针对点的属性      points: {          //点的半径          radius: number          // 绘制点的方法,默认为内置的圆形,可以通过自定义函数来定义其他形状          symbol: "circle"or function      }      // 只针对柱状图的属性      bars: {          barWidth: number          align: "left", "right"or "center"          horizontal: boolean      }      // 只针对线的属性      lines: {          // 指定两个点之间是用水平线还是垂直线连接          steps: boolean      }      // 设置阴影的大小,0消除阴影      shadowSize: number      // 鼠标悬停时的颜色      highlightColor: color or number  }  // 设置各个对应的数据序列,即线的颜色  colors: [ color1, color2, ... ]  // 网格设置  grid: {      // 是否显示格子      show: boolean      // 数据的线是否绘制在网格线下      aboveData: boolean      // 网格线颜色      color: color      // 网格背景颜色      backgroundColor: color/gradient or null      margin: number or margin object({top,left,bottom,right})      // 刻度与网格间距      labelMargin: number      axisMargin: number      markings: array of markings or (fn: axes -> array of markings)      // 边框宽度      borderWidth: number      // 边框颜色      borderColor: color or null      minBorderMargin: number or null      // 监听鼠标点击,会生成plotclick事件      clickable: boolean      // 监听鼠标移动,会生成plothover事件      hoverable: boolean      // 鼠标附近元素高亮显示      autoHighlight: boolean      mouseActiveRadius: number  }  interaction: {      // 最大重绘延迟      redrawOverlayInterval: number or -1  }  // x,y轴的设置  xaxis, yaxis: {      show: nullor true/false      // 刻度文字显示的位置      position: "bottom"or "top"or "left"or "right"      // 设置成time类型时可以用时间作为数据      mode: nullor "time"("time"requires jquery.flot.time.js plugin)      // 时区,仅用于time模式      timezone: null, "browser"or timezone (only makes sense formode: "time")      // 轴文字和刻度文字颜色      color: nullor color spec      // 单独定义刻度文字颜色      tickColor: nullor color spec      font: nullor font spec object      // 最大最小只范围,不设置则自动计算      min: nullor number      max: nullor number      autoscaleMargin: nullor number      // 对数据进行计算后再绘制      transform: nullor fn: number -> number      inverseTransform: nullor fn: number -> number      // 用于自定义刻度显示      ticks: nullor number or ticks array or (fn: axis -> ticks array)      tickSize: number or array      minTickSize: number or array      // 格式化刻度显示      tickFormatter: (fn: number, object -> string) or string      // 刻度显示精确度,即小数位数      tickDecimals: nullor number      // 刻度区域大小      labelWidth: nullor number      labelHeight: nullor number      reserveSpace: nullor true            tickLength: nullor number      alignTicksWithAxis: nullor number  }  // 定义多个坐标轴  xaxes: []  yaxes: []  // 图例  legend: {      show: boolean      // 格式化图例的显示      labelFormatter: nullor (fn: string, series object -> string)      labelBoxBorderColor: color      noColumns: number      position: "ne"or "nw"or "se"or "sw"      margin: number of pixels or [x margin, y margin]      backgroundColor: nullor color      backgroundOpacity: number between 0 and 1 | 
| 1 2 3 4 5 |       //图例的容器,用于从图表中分离      container: nullor jQuery object/DOM element/jQuery expression      sorted: null/false, true, "ascending", "descending"or a comparator  }} | 
格式化图例的显示
通过legend参数的labelFormatter参数来格式化图例的显示,其中series为一个对象(属性参考对象格式的数据):
| 1 2 3 4 | labelFormatter: function(label, series) {  // series is the series object for the label   return'<a href="#'+ label + '" title="'+ series.label + '">'+ label + '</a>';} | 
轴的设置
自定义刻度的显示,可以通过ticks参数来设置,如下定义X轴:
| 1 2 3 | xaxis: {  ticks: [0, 2, 4, 8, 10, 15]} | 
这样轴上只会显示以上定义的刻度。当有时候数据超出这个范围时,部分刻度会被隐藏,这时候就需要手动指定min/max参数,如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 | $.plot($("#placeholder"),   [{ label: "Foo", data: [[10, 1], [17, -14], [30, 5]] },    { label: "Bar", data: [[11, 13], [19, 11], [30, -7]] }  ],  {    xaxis: {      ticks: [0, 2, 4, 8, 10, 15],      min: 0,      max: 30    }  }  ); | 
ticks参数还可以定制刻度显示的文字:
| 1 | ticks: [[0, "零"], [2, "二"], [4, "四"], [8, "八"], [10, "十"], [15, "十五"]] | 
最强大的还是通过自定义函数,通过tickFormatter参数:
| 1 2 3 | tickFormatter: function(axis) {  return"数字"+ axis.toString();} | 
绘制多个刻度轴
如下,绘制两个y轴,同时需要在数据中指定属于哪个轴:
| 1 2 3 4 5 6 7 8 9 10 | $.plot($("#placeholder"),   [ { label: "Foo", data: [[10, 1], [17, -14], [30, 5]] },    { label: "Bar", data: [[11, 13], [19, 11], [30, -7]] },    { label: "Three", data: [[2, 6], [5, 8], [18, 15]], yaxis: 2 },  ],  {    xaxes: [{ position: "bottom"}],    yaxes: [{ position: "left"}, { position: "right", min: 2 }]  }  ); | 
时间格式的数据
使用时间格式的数据需要引用jquery.flot.time.js,它支持以下格式的时间格式化:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | %a: weekday name (customizable)%b: month name (customizable)%d: day of month, zero-padded (01-31)%e: day of month, space-padded ( 1-31)%H: hours, 24-hour time, zero-padded (00-23)%I: hours, 12-hour time, zero-padded (01-12)%m: month, zero-padded (01-12)%M: minutes, zero-padded (00-59)%S: seconds, zero-padded (00-59)%y: year (two digits)%Y: year (four digits)%p: am/pm%P: AM/PM (uppercase version of %p)%w: weekday as number (0-6, 0 being Sunday) | 
还支持自定义月份、一周中每一天的名称:
| 1 2 | monthNames: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"]dayNames: ["dim", "lun", "mar", "mer", "jeu", "ven", "sam"] | 
使用如下:
| 1 2 3 4 5 6 7 8 9 10 11 | $.plot($("#placeholder"),   [{ label: "Foo", data: [[newDate(2010, 1, 1), 1], [newDate(2010, 5, 1), -14], [newDate(2010, 10, 1), 5]] },     { label: "Bar", data: [[newDate(2010, 2, 1), 13], [newDate(2010, 6, 1), 11], [newDate(2010, 12, 1), -7]] }   ],   {     xaxis: {       mode: "time",       timeformat: "%y/%m/%d"     }   }   ); | 
当然,如果不使用timeformat的话,也可以用tickFormatter来格式化显示:
| 1 2 3 4 5 | tickFormatter: function(val, axis) {  vard = newDate(val);  console.log(val)  return(d.getUTCMonth() + 1) + "/"+ d.getUTCDate() + "/"+ d.getFullYear();} | 
特殊的显示需求
可能需要在同一个点上进行时间的对比,比如x轴:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $.plot($("#placeholder"),   [ { label: "Foo", data: [[1, newDate(2010, 1, 1)], [2, newDate(2010, 5, 1)], [3, newDate(2010, 10, 1)]] },     { label: "Bar", data: [[1, newDate(2010, 2, 1)], [2, newDate(2010, 6, 1)], [3, newDate(2010, 12, 1)]] }   ],   {     yaxis: {       mode: "time",       timeformat: "%y/%m/%d"     },     xaxis: {       ticks: [[1, "一"], [2, "二"], [3, "三"]]     }   }   ); | 
在以上方法中,把x轴和x轴刻度的值一一对应,当然也可以换成y轴。
控制线和点的显示
通过series参数,可以控制线的填充、点的显示(点默认是不显示的):
| 1 2 3 4 | series: {  lines: { show: true, fill:true},  points: { show: true, fill: false}} | 
颜色的控制
flot有多个参数都用到了颜色,均可以通过定义单个、或多个颜色来控制每个数据呈现的颜色:
| 1 | colors: ["#d18b2c", "#dba255", "#919733"] | 
再比如网格的背景色:
| 1 2 3 | grid: {    backgroundColor: { colors: ["#000", "#999"] }} | 
颜色还有更加详细的选项来定义:
| 1 | { colors: [{ opacity: 0.8 }, { brightness: 0.6, opacity: 0.8 } ] } | 
跟踪鼠标事件
主要有鼠标移动和点击事件,需要先开启相应开关:
| 1 2 3 4 | grid: {  clickable: true,  hoverable: true} | 
然后再绑定相应的事件,如点击事件:
| 1 2 3 4 5 6 7 8 9 10 | $("#placeholder").bind("plotclick", function(event, pos, item) {  console.log("You clicked at "+ pos.x + ", "+ pos.y);  // axis coordinates for other axes, if present, are in pos.x2, pos.x3, ...  // if you need global screen coordinates, they are pos.pageX, pos.pageY  if(item) {    console.log(item.series, item.datapoint);    console.log("You clicked a point!");  }}); | 
plothover事件的的绑定也一样。item对象主要有以下属性:
| 1 2 3 4 5 6 7 | item: {    datapoint: the point, e.g. [0, 2]    dataIndex: the index of the point inthe data array    series: the series object    seriesIndex: the index of the series    pageX, pageY: the global screen coordinates of the point} | 
内置方法
- highlight(series, datapoint):高亮显示point
- unhighlight(series, datapoint) or unhighlight():取消高亮point,没有参数则取消高亮当前的point
- setData(data):重新设置数据,需要调用draw()方法来重绘
- setupGrid():重新计算坐标、轴,需要调用draw()方法来重绘
- draw():重绘图表
- triggerRedrawOverlay():更新可交互的区域,如point
- width()/height():获取宽高
- offset():获取偏移
- pointOffset({ x: xpos, y: ypos }):获取某个点相对于placeholder的div的偏移
- resize():调整图表的大小
- shutdown():清理即取消绑定所有事件处理函数
还有一些其他函数,但需要你比较了解flot内部运作,否则可能产生不好的结果:
- getData():获取数据,即在$.plot方法中定义的数据
- getAxes():获取坐标轴
- getPlaceholder():获取placeholder元素
- getCanvas():获取canvas对象
- getPlotOffset():获取偏移
- getOptions():获取设置的选项
如highlight方法,就可以在click事件中使用:
| 1 2 3 4 5 6 7 | varpl = $.plot($("#placeholder"), data, options); $("#placeholder").bind("plotclick", function(event, pos, item) {   if(item) {     pl.highlight(item.series, item.datapoint);   } }); | 
flot还提供了一些函数,用于在绘图各个流程步骤中进行一些额外的处理,这里不再列出。
相关资源
插件主页:http://code.google.com/p/flot/ (API文档:http://people.iola.dk/olau/flot/API.txt)
最新版本:https://github.com/flot/flot (API文档:https://github.com/flot/flot/blob/master/API.md)
在线DEMO:http://people.iola.dk/olau/flot/examples/
Flot的插件:http://code.google.com/p/flot/wiki/Plugins (实现更多类型的图表)
 
 
 
 
 
 
 

 
       
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号