轉載自:http://www.itivy.com/ivy/archive/2011/6/4/jquery-flot-chinese-doc.htmljavascript
最近正在使用JQuery的flot進行畫圖,可是這方面的中文幫助實在是太少了,乾脆把英文的document直接翻譯一下吧。由於也是再學習過程中,不免會存在翻譯不許確的地方,若是文中描述的不明白的話,能夠參考一下原文:http://people.iola.dk/olau/flot/API.txt
html
調用plot函數的方法以下:java
1
|
var
plot = $.plot(placeholder, data, options)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
{
color: color or number
data: rawdata
label: string
lines: specific lines options
bars: specific bars options
points: specific points options
xaxis: 1 or 2
yaxis: 1 or 2
clickable: boolean
hoverable: boolean
shadowSize: number
}
|
1
2
3
4
|
{
label:
"y = 3"
,
data: [[0, 3], [10, 3]]
}
|
label是說明這一個數據序列的含義的,若是隻有一個序列的話就沒有必要設置這個屬性。若是有多個序列,就要設置label,從而能夠在圖中區分出序列的含義。
若是不設置color,那麼會自動生成color來進行顯示。
若是你想讓用戶添加和刪除數據序列的話,剩下的屬性就很是有用了。
xaxis和yaxis選項設置使用哪一個維度,默認是設置成1的,若是設置成2的話,就使用第二個維度(x軸在上面,y軸在右邊)。
clickable和hoverable能夠設置成false,當整個圖表設置成可交互時,這個選項可讓這條特定的數據序列讓用戶沒法交互。
沒有說明的屬性會在後面詳細介紹,大多數狀況話都是使用默認值。當你要使用本身定義的值時,就會把默認的值給覆蓋。
這是一個比較複雜的數據序列定義:
[ { label: "Foo", data: [ [10, 1], [17, -14], [30, 5] ] },
{ label: "Bar", data: [ [11, 13], [19, 11], [30, -7] ] } ]
Options的含義:
全部的選項都是徹底可選的。若是想要修改的話,把它看成一個對象來處理就能夠了:jquery
1
2
3
4
5
6
|
var
options = {
series: {
lines: { show:
true
},
points: { show:
true
}
}
};
|
1
2
3
4
5
6
7
8
9
10
11
|
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
container:
null
or jQuery object/DOM element/jQuery expression
}
|
1
2
3
4
|
labelFormatter:
function
(label, series) {
// series is the series object for the label
return
'<a href="#'
+ label +
'" mce_href="#'
+ label +
'">'
+ label +
'</a>'
;
}
|
關於軸的用戶設置:算法
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
|
xaxis, yaxis: {
show:
null
or
true
/
false
position:
"bottom"
or
"top"
or
"left"
or
"right"
mode:
null
or
"time"
color:
null
or color spec
tickColor:
null
or color spec
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: range -> 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
}
|
show:若是不設置這個屬性的話,flot會自動的來選擇,好比:數據與軸有關係的話,那麼就會把軸顯示出來,固然更靈活的方式仍是用數據庫
true或者false來設定這個屬性。express
position:用來定義軸文字顯示的位置,是在X軸的上方仍是下方,是在Y軸的左邊仍是右邊。canvas
mode:軸的數據類型,默認的是數值類型,當設置成time類型的話,就能夠用時間作爲一個軸。
color:定義軸標識文字和座標的顏色。若是不設置的話,就與圖表中網格的顏色是相同的。固然也能夠本身來設置顏色,使用"tickColor"還數組
能夠單獨定義座標的顏色。瀏覽器
min/max:描述軸最大值和最小值範圍。若是不設置的話,flot會自動的計算並生成一個範圍來進行顯示。
autoscaleMargin:這個有一點難理解。flot自動計算min/max的範圍的時候會加上一個值,從而防止有的點會放到圖的邊緣。這個屬性只能
在不設置max/min的時候纔可使用。若是設置了一個margin,flot會延長軸的結束點從而構成一個完整的座標。默認的設置是x軸沒有margin,y軸有0.02的margin。默認的設置已經能夠知足大多數的使用了。
"transform","inverseTransform":能夠對原始的數據進行一些特殊的計算之後再進行繪製。好比:能夠經過這種方法來繪製一些非線性
的曲線。例如:
1
2
3
4
|
xaxis: {
transform:
function
(v) {
return
Math.log(v); },
inverseTransform:
function
(v) {
return
Math.exp(v); }
}
|
1
2
3
4
|
yaxis: {
transform:
function
(v) {
return
-v; },
inverseTransform:
function
(v) {
return
-v; }
}
|
剩下的選項都是處理刻度的。若是不對刻度進行任何的設置的話,座標生成函數會自動的計算刻度。算法會先估算刻度的個數,再計算出兩個刻度之間的間隔大小, 從而能夠生成完整的刻度了。你能夠給算法設置刻度的個數("ticks"),算法會根據原始數據的範圍返回一個最接近你設置的刻度數的一個值,也就是說如 果你設置了3,那麼它返回5個座標也是很正常的,由於算法認爲5個刻度會更合適。若是不設置刻度的話,把"ticks"設置成0或者空數組就能夠了。還可 以經過設置"tickSize"來定義兩個刻度之間的差值,若是設置成2,那麼刻度就會是2,4,6. 經過"minTickSize"能夠設置兩個刻度差值的最小值。對於時間刻度,咱們能夠設置數組來完成:[2, "month"]。
最狠的方法仍是直接忽略flot自帶的算法,徹底使用數組本身定義的刻度:Flot還支持更牛X的可擴展性,就是能夠調用一個函數來造成各個刻度的值。在函數中須要經過最小值,最大值和本身設定的一個間隔來計算出一個數組,做爲各個刻度:
1
2
3
4
5
6
7
8
9
10
|
function
piTickGenerator(axis) {
var
res = [], i = Math.floor(axis.min / Math.PI);
do
{
var
v = i * Math.PI;
res.push([v, i +
"\u03c0"
]);
++i;
}
while
(v < axis.max);
return
res;
}
|
給"tickFormatter"定義也一個函數能夠靈活的格式化刻度的顯示,函數有兩個參數,一個是刻度的值,一個是軸上的最大值和最小值,返回值必定要是string類型:
function formatter(val, axis) {
return val.toFixed(axis.tickDecimals);
}
對於一個軸對象,有min和max這兩個屬性,還有"tickDecimals"是座標顯示的精度,"tickSize"是兩個刻度之間的差值,有了這麼多的屬性,就能夠本身定製刻度的顯示內容:
1
2
3
4
5
6
7
8
|
function
suffixFormatter(val, axis) {
if
(val > 1000000)
return
(val / 1000000).toFixed(axis.tickDecimals) +
" MB"
;
else
if
(val > 1000)
return
(val / 1000).toFixed(axis.tickDecimals) +
" kB"
;
else
return
val.toFixed(axis.tickDecimals) +
" B"
;
}
|
"labelWidth"和"labelHeight"是定義刻度顯示區域的。"reserveSpace"的意思是即便你不定義軸,flot也會 使用這個屬性把軸佔用的空間給預留出來。當繪製單行多軸圖表時與"labelWidth"和"labelHeight"一塊兒使用會獲得不少的效果。
"tickLength"定義座標刻度的長度,null是默認設置,也就是一個很小的刻度,若是設置成0,在軸上就不會顯示刻度。
"alignTicksWithAxis":若是設置成其它軸的數字,Flot會在自動生成刻度的時候會與其它軸上的刻度對齊的。這樣會更加的美觀,尤爲是圖中有網格,而且有多具軸的時候,很是的實用。
繪製多個軸:
若是你須要繪製多個軸的話,數據序列就要按照下面的格式給出,{ data: [...], yaxis: 2 }代表這個序列要使用第二個Y軸。這時要設置軸的顯示形式的話,就不能直接使用xaxis/yaxis的選項了,而是要有兩個數組:
{
xaxes: [ { position: "top" } ],
yaxes: [ { }, { position: "right", min: 20 } ]
}
若是全部的Y軸都想設置成相同的值的話,使用yaxis: { min: 0 }就能夠了。
時間類型的數據序列:
============================
時間序列比數據序列就有一點難了。由於時間序列並非按照10進制來排列的,因此Flot須要把時間轉換成數值,再進行處理。Flot是經過 javascript中的timestamps來支持時間序列的。timestamp是一個時間距1970年1月1日00:00:00的毫秒數,相似與 Unix系統中使用的timestamps,只不過javascript的單位是毫秒,unix的意單位是秒。能夠經過下面的來獲取瀏覽器的 timestamp:
alert((new Date()).getTime())
通常來講,你們都但願在網頁上顯示本地的時間,可是Flot只能把timestamp轉換成UTC的時間來顯示,因此惟一的方法就是獲取本瀏覽當前的 timestamp,和時區,再對timestamp的值進行計算,從而獲得UTC時間與當前時間相等時的UTC timestamp。再把轉換後的值提供給Flot來繪圖。
這時就能夠用轉換後的timestamp來構造原始的數據的,並把軸的類型定義成"time",Flot就能夠自動的計算刻度並格式化它們。固然了,也能夠本身定義刻度,可是必定要使用數值型的參數,不能是對象類型。刻度的生成和格式化也能夠經過軸的選項來自定義:
minTickSize: array
timeformat: null or format string
monthNames: null or array of size 12 of strings
twelveHourClock: boolean
"timeformat":時間的顯示形式:
xaxis: {
mode: "time"
timeformat: "%y/%m/%d"
}
時間刻度就會顯示成"2000/12/24",具體的格式定義參考下面:
%h: 小時
%H: 小時 (左邊補0)
%M: 分鐘 (左邊補0)
%S: 秒 (左邊補0)
%d: 日, 用 %0d 來左邊補0
%m: 月, 用 %0m 來左邊補0
%y: 年 (4位數)
%b: 月的名字 (英文名字)
%p: 12小時投制顯示(am/pm), %h/%H
%P: 12小時投制顯示 (其中的AM/PM)
月份的名字是能夠自定義的:
monthNames: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"]
當"twelveHourClock"被設置成true時,時間就會用12時制來顯示。
你還能夠經過函數來控制刻度的顯示內容。下面的例子是把December 24格式化成24/12:
1
2
3
4
|
tickFormatter:
function
(val, axis) {
var
d =
new
Date(val);
return
d.getUTCDate() +
"/"
+ (d.getUTCMonth() + 1);
}
|
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
|
series: {
lines, points, bars: {
show: boolean
lineWidth: number
fill: boolean or number
fillColor:
null
or color/gradient
}
points: {
radius: number
symbol:
"circle"
or
function
}
bars: {
barWidth: number
align:
"left"
or
"center"
horizontal: boolean
}
lines: {
steps: boolean
}
shadowSize: number
}
|
1
2
3
4
5
6
|
var
options = {
series: {
lines: { show:
true
, fill:
true
, fillColor:
"rgba(255, 255, 255, 0.8)"
},
points: { show:
true
, fill:
false
}
}
};
|
1
2
3
4
5
6
7
|
function
cross(ctx, x, y, radius, shadow) {
var
size = radius * Math.sqrt(Math.PI) / 2;
ctx.moveTo(x - size, y - size);
ctx.lineTo(x + size, y + size);
ctx.moveTo(x - size, y + size);
ctx.lineTo(x + size, y - size);
}
|
"shadowSize"用來設置陰影的大小,單位是pixels,設置成0的話就能夠刪除陰影。
"colors"數組是用來設置在繪圖過程當中各條線使用的顏色的默認值:
colors: ["#d18b2c", "#dba255", "#919733"]
若是數據序列的數量比定義的顏色數量多的話,flot還會生成一些新的顏色用於繪製圖表。
自定義網格
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
grid: {
show: boolean
aboveData: boolean
color: color
backgroundColor: color/gradient or
null
labelMargin: number
axisMargin: number
markings: array of markings or (fn: axes -> array of markings)
borderWidth: number
borderColor: color or
null
minBorderMargin: number or
null
clickable: boolean
hoverable: boolean
autoHighlight: boolean
mouseActiveRadius: number
}
|
1
2
3
4
5
6
|
markings:
function
(axes) {
var
markings = [];
for
(
var
x = Math.floor(axes.xaxis.min); x < axes.xaxis.max; x += 2)
markings.push({ xaxis: { from: x, to: x + 1 } });
return
markings;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
|
$.plot($(
"#placeholder"
), [ d ], { grid: { clickable:
true
} });
$(
"#placeholder"
).bind(
"plotclick"
,
function
(event, pos, item) {
alert(
"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) {
highlight(item.series, item.datapoint);
alert(
"You clicked a point!"
);
}
});
|
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
}
|
若是使用上面的方法來顯示一些信息的話,那麼就須要監聽"mouseout"事件。"mouseActiveRadius"用來定義鼠標作用的範圍。若是有多個數據點在這個範圍中的話,Flot只會選擇最接近的那一個。對柱狀圖而言,最高的那個柱子會被選中。
若是不想有交互的話,就能夠"hoverable" 和 "clickable" 設置成false:{ data: [...], label: "Foo", clickable: false }。
梯度顏色的定義
===================
定義的方法: { colors: [ color1, color2, ... ] }
若是想讓網格的背景從黑色到灰色的話:
grid: {
backgroundColor: { colors: ["#000", "#999"] }
}
對數據序列,能夠設置顏色的透明度和亮度:
{ colors: [{ opacity: 0.8 }, { brightness: 0.6, opacity: 0.8 } ] }
第一個只有透明度,第二個還包含了亮度。對於柱形圖來講,下面的例子可讓柱子逐漸的消失:
bars: {
show: true,
lineWidth: 0,
fill: true,
fillColor: { colors: [ { opacity: 0.8 }, { opacity: 0.1 } ] }
}
Flot目前只能支持垂直方向上從上到下的漸變,由於IE只支持這個模式。
Plot方法
---------------
由plot函數生成的對象提供了可調用的方法
- highlight(series, datapoint)
用來高亮顯示一個數據點。你能夠經過"plotclick"事件獲取對象,或者使用highlight(1, 3)來高亮顯示第2個數據序列中的第4個數據點。
- unhighlight(series, datapoint) or unhighlight()
刪除高亮顯示,若是有參數的話,就是刪除指定高亮的點,若是沒有參數的話,plot就會刪除圖表中全部的高亮顯示。
- setData(data)
用來從新設置數據。可是軸的取值範圍,刻度座標,標籤是不會從新繪製的,能夠調用draw()讓plot繪製新的曲線,可是其它部分不會改變。用這個函數能夠變速的更新一個圖表中的曲線,前提條件是全部值的取值範圍是沒有改變的。
- setupGrid()
從新計算軸的取值範圍,並設置刻度和標籤。若是調用過setData的話,就可使用這個函數從新繪製有影響的部分。
- draw()
從新繪製圖表中的顯示曲線部分。
- triggerRedrawOverlay()
在可繪製區域上更新可交互的部分,如選擇區域和點的高亮。當要本身編寫插件時是很是有用的。圖表並不會立刻從新繪製,而是能夠設置一個定時器來獲取屢次的重給事件。
- width()/height()
獲取可繪製區域的寬度和高度。也就是網格中的區域。
- offset()
返回網格中可繪圖的區域相對於整個文檔的偏移,當計算鼠標所在的位置時很重要。把event.pageX/Y減去這個偏移就是在繪圖區域中的座標。
- pointOffset({ x: xpos, y: ypos })
(x,y)這個數據點在包含繪圖div窗口中的偏移。
- resize()
若是繪圖窗口的大小發生改變,就能夠調用這個函數來從新繪圖。
- shutdown()
關閉已經註冊的全部事件的處理函數。
還會一些其它的函數,可是須要你瞭解Flot內部的代碼流程。若是你修改了獲取到對象中的屬性的話,那麼你就修改了Flot內部使用的對象,Flot沒法及時的更新你修改的內容,還有可能會影響繪圖功能,因此使用的時候必定要當心。具體的使用方法能夠參考原版的文檔。
- getData()
- getAxes()
- getPlaceholder()
- getCanvas()
- getPlotOffset()
- getOptions()
Hooks(鉤子函數)
======================
Plot對象在繪製過程當中能夠添加許多的鉤子函數,從而添加一些方法,在方法還能夠訪問Flot中的內部數據。
下面就是Flot處理流程的概要:
1. 插件的初始化,處理各個選項
2. 構造繪圖區域
3. 設置各種數據:處理用戶錄入的數據,計算顯示用的顏色,把原始數據轉化成內部格式,規格化數據,查看最大最小值用來設置軸的取值範圍。
4. 網格的設置:計算軸的空間,刻度,刻度的標籤。
5. 繪圖: 繪製網格,按照順序繪圖
6. 設置事件處理的自定義函數
7. 答覆事件。
8. 關閉:通常都是發生在整個圖表被重寫的時候發生。
鉤子函數一個簡單的函數,並放在了一個特定的數組當中。你可使用"hooks"來添加鉤子函數,當繪圖完成之後,鉤子函數仍然是起做用的,由於它的定義已經存在於plot的對象中了。
1
2
3
4
5
6
7
8
|
// define a simple draw hook
function
hellohook(plot, canvascontext) { alert(
"hello!"
); };
// pass it in, in an array since we might want to specify several
var
plot = $.plot(placeholder, data, { hooks: { draw: [hellohook] } });
// we can now find it again in plot.hooks.draw[0] unless a plugin
// has added other hooks
|
1
2
3
4
5
|
function
multiply(plot, series, datapoints) {
var
points = datapoints.points, ps = datapoints.pointsize;
for
(
var
i = 0; i < points.length; i += ps)
points[i + 1] *= 2;
}
|
1
2
3
4
5
|
function
(plot, eventHolder) {
eventHolder.mousedown(
function
(e) {
alert(
"You pressed the mouse at "
+ e.pageX +
" "
+ e.pageY);
});
}
|