本示例利用官方示例改造而成,生成帶圖示的折線圖,標出各折線的名稱,能夠篩選想要顯示的折線。canvas
要實現最終效果,咱們要分三步走:數據結構
生成折線圖;dom
生成自定義提示;this
生成圖示(折線顯示控制板)spa
首先,咱們要設置折線圖的位置。code
<div style="width:50%"> <div id="line-legend"> </div> <div> <canvas id="line-chart" height="450px" width="800px"></canvas> </div> </div>
咱們將圖表放置於id爲line-chart
的canvas
中,而圖例則在id爲line-legend
的div
中。blog
接着,咱們要生成折線圖。教程
設置x軸數據事件
var x_labels = ["January","February","March","April","May","June","July"];
設置y軸數據圖片
var default_datasets = [ { label: "My First dataset", fillColor : "rgba(220,220,220,0.2)", strokeColor : "rgba(220,220,220,1)", pointColor : "rgba(220,220,220,1)", pointStrokeColor : "#fff", pointHighlightFill : "#fff", pointHighlightStroke : "rgba(220,220,220,1)", data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()] }, { label: "My Second dataset", fillColor : "rgba(151,187,205,0.2)", strokeColor : "rgba(151,187,205,1)", pointColor : "rgba(151,187,205,1)", pointStrokeColor : "#fff", pointHighlightFill : "#fff", pointHighlightStroke : "rgba(151,187,205,1)", data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()] } ];
將x軸和y軸的數據打包成數據包:
var lineChartData = { labels : x_labels, datasets : default_datasets };
設置顯示的效果(這裏是直接從官網示例裏copy過來的:-)
var lineChartOptions = { //Boolean - If we should show the scale at all showScale: true, ... //Boolean - whether to make the chart responsive to window resizing responsive: true, };
生成折線圖
var lineChartCanvas = chart.get(0).getContext("2d"); var lineChart = new Chart(lineChartCanvas); var line_chart_handle = lineChart.Line(lineChartData, lineChartOptions);
本階段效果
以上示例可參考官方教程。
剛纔咱們成功地繪製了一張圖表,可是基本圖表中的提示只顯示了折線的顏色和值,咱們還但願能把折線的名稱也加上,那到底該怎麼作呢?
很簡單,這個功能屬於圖表的要顯示的效果,還記得剛纔咱們設置的lineChartOptions
嗎,它就是設定顯示效果的參數。只要在其中設定一項新的參數multiTooltipTemplate
便可,該參數用於自定義數據提示tooltip。
multiTooltipTemplate: "<%if (datasetLabel){%><%=datasetLabel%>: <%}%><%= value %>"
上面的代碼是什麼意思呢?大體能夠看出,是給multiTooltipTemplate
賦了一個值,而這個值就是咱們想要顯示的數據的樣式。你大概猜到了,datasetLabel
其實就是折線標題的變量。
該功能雖然簡單,但基本上出圖表都會用到,因此在此專門用一節來講明。
終於到達咱們的重頭戲,如今要來實現圖示功能了。
咱們再將這個大目標劃分爲兩個具體的小目標:
首先,咱們先將圖示展現出來;
接着,點擊圖示以後,動態顯示或隱藏指定的折線。
咱們以前已經設置好了圖例所在,如今填入兩個checkbox。
<div id="line-legend"> <ul class="line-legend"> <li class="checkbox-five"> <input type="checkbox" name="line-legend" value="0" checked="checked"> <label for="line-legend" style="background-color:rgba(220, 220, 220, 1);"> </label> <span>My First dataset</span> </li> <li class="checkbox-five"> <input type="checkbox" name="line-legend" value="1" checked="checked"> <label for="line-legend" style="background-color:rgba(151, 187, 205, 1);"> </label> <span>My Second dataset</span> </li> </ul> </div>
爲兩條折線添加了checkbox,但點擊了它折線也沒有變化。不要緊,咱們如今來爲折線添加上事件響應,使得圖表能自由顯示或是隱藏折線。
// 給圖例中的選框增長事件響應 // 被選中的則顯示其對應折線,未選中的不顯示 $('[name = \'line-legend\']:checkbox').each(function(key, value) { // 設置全部的checkbox爲選中 $(this).attr('checked', true); // 設置checkbox被取消選擇以後,將該曲線消除 $(this).click(function() { // 顯示相應的折線 } else { // 刪除被選中折線上的點 } });
如今咱們爲checkbox添加上了事件響應,具體的響應事件將在下一節說明。
要想知道如何讓折線從圖表中顯示出來,或是消息,首先要來了解曲線的數據結構。
ChartJS裏的點是由數據包構成的,而一個數據包分紅兩部分:一塊包含點的信息,一塊用於顯示該點。
瞭解了ChartJS上折線圖的數據結構,你們也就明白了:顯示一條折線,便是添加points
;隱藏一條折線,便是將其points
去除。
因此,當某一條曲線被選中時,咱們就根據該曲線的信息生成新的點;
if ($(this).is(':checked')) { // 插入被選中折線上的點 $.each(y_datasets[index].data, function(key, value) { line_chart_handle.datasets[index].points.push(new line_chart_handle.PointClass({ value : value, label : lineChartData.labels[key], datasetLabel : lineChartData.datasets[index].label, x: line_chart_handle.scale.calculateX(line_chart_handle.scale.valuesCount + 1), y: line_chart_handle.scale.endPoint, strokeColor : line_chart_handle.datasets[index].pointStrokeColor, fillColor : line_chart_handle.datasets[index].pointColor })); }); }
當一條曲線被取消選中時,咱們只須要將這條曲線上的點到清空便可。
else { // 刪除被選中折線上的點 for (var i = line_chart_handle.datasets[index].points.length - 1; i >= 0; i--) { line_chart_handle.datasets[index].points.shift(); } }
大功告成!
下載地址:百度雲(http://pan.baidu.com/s/1c00oYJm)
注:若是連接失效了,私信我吧~(但願你不要覺得我有別的企圖)