先来看看效果图
下面直接上源代码 , HTML 文件
<html> <head> <meta charset = "utf-8"> <title> 实时刷新折线图 </title> <style>. السكتة الدماغية: أسود. تقديم الشكل: crispedges. }. حجم الخط: 11px ؛ } .overlay {fill: none ؛ أحداث المؤشر: الكل ؛ } .tooltip {width: 150px ؛ الارتفاع: السيارات ؛ الموقف: مطلق ؛ Font-Family: Simsun ؛ حجم الخط: 16 بكسل ؛ رفع الخط: 26 بكسل ؛ محاذاة النص: اليسار ؛ الحدود: 1 بكسل سوداء صلبة. خلفية اللون: أبيض. الحدود الحدودية: 5px ؛ } .tooltip .title {border-bottom: 1px solid #000 ؛ محاذاة النص: المركز ؛ } .tooltip .descolor {width: 10px ؛ الارتفاع: 10 بكسل ؛ تعويم: اليسار. الهامش: 9px 8px 1px 8px ؛ } .tooltip .destext {display: inline ؛ } .focusline {stroke: Black ؛ عرض السكتة الدماغية: 1px ؛ السكتة الدماغية: 5،5 ؛ } </style> </head> <body> <script src = "http://d3js.org/d3.v3.js" charset = "utf-8"> </script> <script src = "linechart.js xmlns: xlink = "http://www.w3 contentStyleType = "text/css" viewbox = "0 0 2000.0 2000.0" PROTERVEASPECTRATIO = "Xmidymid Meet" Xmlns = "http://www.w3.org/2000/svg" version = "1.0 ' referveaspectRatio = "None Meet"> </shysmar> <symbor id = "fillgauge2" viewbox = "0 0 200.0 200.0" preserveaspectratio = "none meet"> </defs> <use x = "0" y = "0" xmlns = xlink = xLink: href = "#fillgauge1" xlink: type = "simple" xLink: Actuate = "Onload" symboltype = "17" xLink: href = "#fillgauge2" xlink: type = "simple" xLink: Actuate = "onload" symboltype = "17" [2003،16500] ، [2004،19440] ، [2005،22870] ، [2006،27930] ، [2007،35040] ، [2008،45470] ، [2009،51050] ، [2010،59490] "الولايات المتحدة الأمريكية" ، الناتج المحلي الإجمالي: [[2000،47310] ، [2001،41590] ، [2002،39800] ، [2003،43020] ، [2004،46550] ، [2005،45710] ، [2006،43560] ، [2007،43560] ، [2008،4840] ، [2009،50350] ، [2010،54950] ، [2011،59050] ، [2012،59370] ، [2013،48980]] وظيفة newValue () {if (math.random ()> .5) {return Math.Round (Math.Random ()*100) ؛ } آخر {return (Math.Random ()*100) .Tofixed (1) ؛ }} function refreshline (gauge1) {// alert ("hehe") ؛ // document.getElementById ("fillgauge1"). innerhtml = "" ؛ var updatedata = [{Country: "China" ، GDP: [[2000 ، NewValue ()] ، [2001 ، NewValue ()] ، [2002 ، NewValue ()] ، [2003 ، NewValue ()] ، [2004 ، NewValue ()] ، [2005 ، NewValue ()] [2006 ، NewValue ()] ، [2007 ، NewValue ()] ، [2008 ، NewValue ()] ، [2009 ، NewValue ()] ، [2010 ، NewValue ()] ، [2011 ، NewValue ()] ، [2012 ، NewValue ()] ، [2013 ، Newvalue ()]]]} [[2000 ، NewValue ()] ، [2001 ، NewValue ()] ، [2002 ، NewValue ()] ، [2003 ، NewValue ()] ، [2004 ، NewValue ()] ، [2005 ، NewValue ()] ، [2009 ، NewValue ()] ، [2010 ، NewValue ()] ، [2011 ، NewValue ()] ، [2012 ، NewValue ()] ، [2013 ، NewValue ()]]}] ؛ Gauge1.update (updatedata) ؛ } self.setInterval ("refreshline (gauge1)" ، 5000) ؛ </script> </body> </html>Linechart.JS 负责加载和刷新折线图
وظيفة loadlinechart (elementId ، dataSet) {var svg = d3.select ("#" + elementId) ؛ var strs = svg.attr ("viewbox"). split ("") ؛ تنبيه (مجموعة البيانات) ؛ var width = strs [2] ؛ var height = strs [3] ؛ // 外边框 var padding = {top: 50 ، اليمين: 50 ، القاع: 50 ، اليسار: 50} ؛ var names = new array () ؛ // 计算 GDP 的最大值 var gdpmax = 0 ؛ لـ (var i = 0 ؛ i <dataset.length ؛ i ++) {var currgdp = d3.max (dataSet [i] .gdp ، function (d) {return d [1] ؛}) ؛ if (currgdp> gdpmax) gdpmax = currgdp ؛ } var gdpnumb = dataset [0] .gdp.length ؛ لـ (var j = 0 ؛ j <gdpnumb ؛ j ++) {names [j] = (dataset [0] .gdp [j]) [0] ؛ } تنبيه (أسماء) ؛ var xscale = d3.scale.linear () .domain ([2000 ، 2013]) .Range ([0 ، width - padding.left - padding.right]) ؛ // var xscale = d3.scale.ordinal () // .domain (names) // .rangeroundbands ([0 ، width - padding.left - padding.right]) ؛ var yscale = d3.scale.linear () .domain ([0 ، gdpmax * 1.1]) .range ([height - padding.top - padding.bottom ، 0]) ؛ // 创建一个直线生成器 var linepath = d3.svg.line () .x (function (d) {return xScale (d [0]) ؛}) .y (function (d) {return yscale (d [1]) ؛}). // 定义两个颜色 var colors = [d3.rgb (0 ، 0 ، 255) ، d3.rgb (0 ، 255 ، 0)] ؛ // 添加路径 svg.selectall ("path") // 选择 <svg> 中所有的 <path> .data (DataSet) // 绑定数据 .enter () // 选择 Enter 部分. {Return LinePath (D.GDP) ؛ // 添加垂直于 x 轴的对齐线 var vline = svg.append ("line") .Attr ("class" ، "FocusLine") .style ("Display" ، "None") ؛ // 添加一个提示框 var tooltip = d3.select ("body") .Append ("div") .ATTR ("class" ، "tooltip") .style ("Opacity" ، 0.0) ؛ var title = tooltip.append ("div") .attr ("class" ، "title") ؛ var des = tooltip.selectall (". des") .Data (DataSet) .enter () .Append ("div") ؛ var descolor = des.append ("div") .attr ("class" ، "descolor") ؛ var destext = des.append ("div") .attr ("class" ، "destext") ؛ // 添加一个透明的监视鼠标事件用的矩形 svg.append ("rect") .Attr ("class" ، "overlay") .Attr ("x" ، padding.left) .attr ("y" ، padding.top) .Attr ( tooltip.style ("Left" ، (d3.event.pagex) Vline.Style ("Display" ، "none") ؛ دالة mousemove () { / * 当鼠标在透明矩形内滑动时调用 * /// 折线的源数组 var data = dataset [0] .gdp ؛ // 获取鼠标相对于透明矩形左上角的坐标 , 左上角坐标为 (0،0) var mousex = d3.mouse (this) [0] - padding.left ؛ var mousey = d3.mouse (this) [1] - padding.top ؛ // 通过比例尺的反函数计算原数据中的值 , 例如 x0 为某个年份 , y0 为 gdp 值 var x0 = xscale.invert (mousex) ؛ var y0 = yscale.invert (mousey) ؛ // 对 x0 四舍五入 , 如果 x0 是 2005.6 , 则返回 2006 ;如果是 2005.2 , 则返回 2005 x0 = Math.Round (x0) ؛ // 查找在原数组中 x0 的值 , 并返回索引号 var bisect = d3.biSector (function (d) {return d [0] ؛}). Left ؛ var index = bisect (البيانات ، x0) ؛ // 获取年份和 GDP 数据 var year = x0 ؛ var gdp = [] ؛ لـ (var k = 0 ؛ k <dataset.length ؛ k ++) {gdp [k] = {country: dataset [k] .country ، value: dataset [k] .gdp [index] [1]} ؛ } // 设置提示框的标题文字 (年份) title.html ("<strong>" + year + "年 </strong>") ؛ // 设置颜色标记的颜色 descolor.style ("background-color" ، function (d ، i) {return colors [i] ؛}) ؛ // 设置描述文字的内容 destext.html (function (d ، i) {return gdp [i] .country + "/t" + "<strong>" + gdp [i] .value + "</strong>" ؛}) ؛ // 设置提示框的位置 tooltip.style ("Left" ، (d3.event.pagex) + "px") .style ("Top" ، (d3.event.pagey + 20) + "px") ؛ // 获取垂直对齐线的 x 坐标 var vlx = xscale (data [index] [0]) + padding.left ؛ // 设定垂直对齐线的起点和终点 vline.attr ("x1" ، vlx) .attr ("y1" ، padding.top) .ATTR ("x2" ، vlx) .ATTR ("y2" ، height - padding.bottom) ؛ } var markstep = 80 ؛ var gmark = svg.selectall (". gmark") .Data (DataSet) .enter () .Append ("g") .ATTR ("transform" ، function (d ، i) {return "translate (" + (padding.left + i * markstep) + "، gmark.append ("rect") .attr ("x" ، 0) .ATTR ("y" ، 0) .Attr ("width" ، 10) .Attr ("height" ، 10) .Attr ("fill" ، function (d ، i) {return colors [i] ؛ gmark.append ("text") .attr ("dx" ، 15) .Attr ("dy" ، ".5em") .Attr ("fill" ، "Black") .Text (function (d) {return d.Country ؛}) ؛ // x 轴 var xaxis = d3.svg.axis () .scale (xscale) .ticks (5) .tickformat (d3.format ("d")) .orient ("Bottom") ؛ // y 轴 var yaxis = d3.svg.axis () .scale (yscale) .orient ("Left") ؛ svg.append ("g") .ATTR ("class" ، "Axis") .ATTR ("Transform" ، "Translate (" + padding.left + "،" + (height - padding.bottom) + ")) .Call (xaxis) ؛ svg.append ("g") .ATTR ("class" ، "y Axis") .ATTR ("Transform" ، "Translate (" + padding.left + "،" + padding.top + ") .Call (yaxis) ؛ دالة updatelinechart () {this.update = function (updatedata) {//xscale.domain(updatedata،function(d) {regrourn d.name}) ؛ var numValues = updatedata.length ؛ var updategdpmax = 0 ؛ لـ (var i = 0 ؛ i <updatedata.length ؛ i ++) {var currgdp = d3.max (updatedata [i] .gdp ، function (d) {return d [1] ؛}) ؛ إذا (currgdp> updategdpmax) updategdpmax = currgdp ؛ } yscale = d3.scale.linear () .domain ([0 ، updategdpmax * 1.1]) .range ([height - padding.top - padding.bottom ، 0]) ؛ yaxis = d3.svg.axis () .scale (yscale) .orient ("اليسار") ؛ svg.selectall ("gyaxis") .Call (yaxis) ؛ svg.selectall ("path") // 选择 <svg> 中所有的 <path> .data (updatedata) // 绑定数据 .transition () .Duration (2000) .ase ("Linear") .ATTR ("D" ، function (d) {retrore linepath (d.gdp) ؛ // 返回直线生成器得到的路径 返回直线生成器得到的路径}) ؛ }} إرجاع updatelinechart () ؛}刚开始数据刷新了但是坐标轴木有刷新
引入
svg.selectall ("gyaxis") .Call (yaxis) ؛以上就是 d3.js 实现实时刷新折线图的全部内容 , 希望给大家学习 d3.js 带来帮助。