Flot是純Javascript實作的基于jQuery的圖表插件,主要支援線狀圖和柱狀圖的繪制(通過插件也可以支援餅狀圖)。
它的特點是使用簡單、圖形美觀,支援滑鼠跟蹤及縮放功能。
Flot是基于canvas進行圖表的繪制,可以在IE6+/Firefox2+/Safari3+/Opera9.5+/Chrome等主流浏覽器上運作;其中IE9以下浏覽器不支援canvas标記,需要額外引用excanvas庫(VML)來實作。
這是我做的測試效果圖。
[html] view plain copy
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>demo</title>
- <link href="../examples/layout.css" rel="stylesheet" type="text/css">
- <!--[if lte IE 8]><script language="javascript" type="text/javascript" src="../excanvas.min.js"></script><![endif]-->
- <script language="javascript" type="text/javascript" src="../jquery.js"></script>
- <script language="javascript" type="text/javascript" src="../jquery.flot.js"></script>
- </head>
- <body>
- <div id="placeholder" style="width:600px;height:300px"></div>
- <script type="text/javascript">
- $(function () {
- var pl = $.plot($("#placeholder"),
- [//球員圖檔可以單獨定義 或者和下面的日期一樣 和每場資料合并在一起(這樣好像有點浪費帶寬)
- { label: "凱文-杜蘭特", data: [[1,49,"熱火vs湖人","05月01日"], [2,22,"熱火vs雷霆","05月02日"], [3,36,"熱火vs蠻牛","05月03日"],[4,27,"熱火vs騎士","05月24日"],[5,39,"熱火vs雷霆","05月25日"],[6,25,"熱火vs蠻牛","05月26日"],[7,18,"熱火vs湖人","05月27日"],[8,29,"熱火vs騎士","05月28日"],[9,32,"熱火vs劍客","05月29日"],[10,27,"熱火vs測試","05月30日"]]},
- { label: "麥克-詹姆斯", data: [[1,0,"冷鋒vs雷霆","05月21日"],[2,0,"冷鋒vs雷霆","05月22日"], [3,0,"冷鋒vs雷霆","05月23日"],[4,37,"冷鋒vs雷霆","05月24日"],[5,29,"冷鋒vs雷霆","05月25日"],[6,21,"冷鋒vs雷霆","05月26日"],[7,28,"冷鋒vs雷霆","05月27日"],[8,19,"冷鋒vs雷霆","05月28日"],[9,22,"冷鋒vs雷霆","05月29日"],[10,29,"冷鋒vs雷霆","05月30日"]]}
- ],
- {
- series: {//控制線的填充、點的顯示
- lines: { show: true},
- points: { show: true}
- },
- //開啟滑鼠移動和點選事件 折線圖外框顔色 和 外框的寬度
- grid: { hoverable: true, clickable: true, borderColor:'#000',borderWidth:1},
- xaxis: {//x軸的最大最小範圍 和 刻度自定義。
- min: 0,
- max: 22,
- ticks: [1,3,5,7,9,11,13,15,17,19,21]
- },
- yaxis: {//y軸的最小範圍
- min: 0,
- // max: 50
- }
- }
- );
- function showTooltip(x, y, contents) {//浮動塊資訊
- $('<div id="tooltip">' + contents + '</div>').css( {
- position: 'absolute',
- display: 'none',
- top: y + 5,
- left: x + 5,
- border: '1px solid #fdd',
- padding: '2px',
- 'background-color': '#fee',
- opacity: 0.80
- }).appendTo("body").fadeIn(200);
- }
- // function getData(data, x) {
- // // alert(data);
- // // x = x-1;
- // return {data[x]['team'],data[x]['time']};
- // }
- var previousPoint = null;
- $("#placeholder").bind("plothover", function (event, pos, item) {
- if (item) {
- if (previousPoint != item.dataIndex) {
- previousPoint = item.dataIndex;
- $("#tooltip").remove();
- var x = item.datapoint[0],//x y 軸位置
- y = item.datapoint[1],
- n = x-1;
- // alert(item.series);
- //var data = pl.getData();
- var changci = item.series['data'][n][2],//場次資訊 擷取目前焦點的 資料資訊 通過n(即x軸位置擷取資料)
- shijian = item.series['data'][n][3];//同上 場次資訊擷取原理。 比賽時間
- // alert(changci);
- // alert(changci);
- // for(i in item.series){
- // document.write('i:'+i+' '+item.series[i]+'<hr>');
- // }
- var contents = "<img src='http://sports.sohu.com/upload/lakers/Kobe-Bryant.jpg' />比賽場次:"+changci+"<br />得分:"+y+"<br />比賽時間:"+shijian;
- showTooltip(item.pageX, item.pageY,contents);
- }
- }
- else {
- $("#tooltip").remove();
- previousPoint = null;
- }
- });
- });
- </script>
- </body>
- </html>
=========================================下面轉載flot的參數======================================
基本使用
首先,在頁面頭部引用腳本:
?
1 2 3 | |
在頁面中建立一個html标記,如div,然後通過樣式來指定圖表的大小:
?
1 | |
最後,在DOM Ready事件中調用Flot的繪制方法$.plot:
?
1 2 3 | |
這樣就簡單的繪制了一條線。
資料格式
flot的資料格式是數組,數組中包含多個系列的資料,每個系列的資料對應一條線:
?
1 | |
每一個系列的資料可以是一個數組或者對象。
數組格式的資料,每一個點都是一個數組(分x/y軸):
?
1 | |
如下定義了三個點:
?
1 | |
繪制圖表的時候,會把這三個點連接配接起來;假如中間有個點使用了空值即null,這個點的兩邊則不會連接配接起來:
?
1 | |
需要注意的是,每個點的資料必須是數字,如果是字元串,可能會得到奇怪的錯誤。
對象格式的資料,如下:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
通常不需要關心其他選項,隻需要指定label和data:
?
1 2 3 4 | |
對象格式的資料提供更大的靈活性,也更有利于代碼的可讀性,如下定義了兩個系列即兩條線:
?
1 2 3 | |
選項設定
所有的選項都是可選的,改變某個屬性,隻需要指定特定的屬性名稱:
?
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 | |
?
1 2 3 4 5 | |
格式化圖例的顯示
通過legend參數的labelFormatter參數來格式化圖例的顯示,其中series為一個對象(屬性參考對象格式的資料):
?
1 2 3 4 | |
軸的設定
自定義刻度的顯示,可以通過ticks參數來設定,如下定義X軸:
?
1 2 3 | |
這樣軸上隻會顯示以上定義的刻度。當有時候資料超出這個範圍時,部分刻度會被隐藏,這時候就需要手動指定min/max參數,如下:
?
1 2 3 4 5 6 7 8 9 10 11 12 | |
ticks參數還可以定制刻度顯示的文字:
?
1 | |
最強大的還是通過自定義函數,通過tickFormatter參數:
?
1 2 3 | |
繪制多個刻度軸
如下,繪制兩個y軸,同時需要在資料中指定屬于哪個軸:
?
1 2 3 4 5 6 7 8 9 10 | |
時間格式的資料
使用時間格式的資料需要引用jquery.flot.time.js,它支援以下格式的時間格式化:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
還支援自定義月份、一周中每一天的名稱:
?
1 2 | |
使用如下:
?
1 2 3 4 5 6 7 8 9 10 11 | |
當然,如果不使用timeformat的話,也可以用tickFormatter來格式化顯示:
?
1 2 3 4 5 | |
特殊的顯示需求
可能需要在同一個點上進行時間的對比,比如x軸:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
在以上方法中,把x軸和x軸刻度的值一一對應,當然也可以換成y軸。
控制線和點的顯示
通過series參數,可以控制線的填充、點的顯示(點預設是不顯示的):
?
1 2 3 4 | |
顔色的控制
flot有多個參數都用到了顔色,均可以通過定義單個、或多個顔色來控制每個資料呈現的顔色:
?
1 | |
再比如網格的背景色:
?
1 2 3 | |
顔色還有更加詳細的選項來定義:
?
1 | |
跟蹤滑鼠事件
主要有滑鼠移動和點選事件,需要先開啟相應開關:
?
1 2 3 4 | |
然後再綁定相應的事件,如點選事件:
?
1 2 3 4 5 6 7 8 9 10 | |
plothover事件的的綁定也一樣。item對象主要有以下屬性:
?
1 2 3 4 5 6 7 | |
内置方法
- 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 | |
flot還提供了一些函數,用于在繪圖各個流程步驟中進行一些額外的處理,這裡不再列出。