flot - jQuery 圖表插件(jquery.flot)使用


Flot是純Javascript實現的基於jQuery的圖表插件,主要支持線狀圖和柱狀圖的繪制(通過插件也可以支持餅狀圖)。

它的特點是使用簡單、圖形美觀,支持鼠標跟蹤及縮放功能。

Flot是基於canvas進行圖表的繪制,可以在IE6+/Firefox2+/Safari3+/Opera9.5+/Chrome等主流瀏覽器上運行;其中IE9以下瀏覽器不支持canvas標記,需要額外引用excanvas庫(VML)來實現。

基本使用

首先,在頁面頭部引用腳本:

1
2
3
<!--[ if  lte 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
< div  id="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: null  or 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: null  or true / false
       // 刻度文字顯示的位置
       position: "bottom"  or "top"  or "left"  or "right"
       // 設置成time類型時可以用時間作為數據
       mode: null  or "time"  ( "time"  requires jquery.flot.time.js plugin)
       // 時區,僅用於time模式
       timezone: null , "browser"  or timezone (only makes sense for  mode: "time" )
       // 軸文字和刻度文字顏色
       color: null  or color spec
       // 單獨定義刻度文字顏色
       tickColor: null  or color spec
       font: null  or font spec object
       // 最大最小只范圍,不設置則自動計算
       min: null  or number
       max: null  or number
       autoscaleMargin: null  or number
       // 對數據進行計算后再繪制
       transform: null  or fn: number -> number
       inverseTransform: null  or fn: number -> number
       // 用於自定義刻度顯示
       ticks: null  or 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: null  or number
       // 刻度區域大小
       labelWidth: null  or number
       labelHeight: null  or number
       reserveSpace: null  or true
       
       tickLength: null  or number
 
       alignTicksWithAxis: null  or number
   }
   // 定義多個坐標軸
   xaxes: []
   yaxes: []
   // 圖例
   legend: {
       show: boolean
       // 格式化圖例的顯示
       labelFormatter: null  or (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: null  or color
       backgroundOpacity: number between 0 and 1
1
2
3
4
5
       //圖例的容器,用於從圖表中分離
       container: null  or 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: [[ new  Date(2010, 1, 1), 1], [ new  Date(2010, 5, 1), -14], [ new  Date(2010, 10, 1), 5]] },
      { label: "Bar" , data: [[ new  Date(2010, 2, 1), 13], [ new  Date(2010, 6, 1), 11], [ new  Date(2010, 12, 1), -7]] }
    ],
    {
      xaxis: {
        mode: "time" ,
        timeformat: "%y/%m/%d"
      }
    }
    );

當然,如果不使用timeformat的話,也可以用tickFormatter來格式化顯示:

1
2
3
4
5
tickFormatter: function  (val, axis) {
   var  d = new  Date(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, new  Date(2010, 1, 1)], [2, new  Date(2010, 5, 1)], [3, new  Date(2010, 10, 1)]] },
      { label: "Bar" , data: [[1, new  Date(2010, 2, 1)], [2, new  Date(2010, 6, 1)], [3, new  Date(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 in  the 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
var  pl = $.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 (實現更多類型的圖表)


轉自:http://www.cnblogs.com/lwme/archive/2012/08/18/jquery-flot-plugin.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM