欢迎来到福编程网,本站提供各种互联网专业知识!

基于d3.js实现实时刷新的折线图

发布时间:2016-08-03 作者:投稿daisy 来源:转载
本文用实例演示如何用d3.js实现实时刷新的折线图,非常具有实用价值,需要的朋友可以参考下。

先来看看效果图

下面直接上源代码,html文件

  1. 实时刷新折线图

lineChart.js负责加载和刷新折线图

代码
  1. function loadLineChart(elementId, dataset) {
  2. var svg = d3.select("#" + elementId);
  3. var strs = svg.attr("viewBox").split(" ");
  4. alert(dataset);
  5. var width = strs[2];
  6. var height = strs[3];
  7. //外边框
  8. var padding = {
  9. top : 50,
  10. right : 50,
  11. bottom : 50,
  12. left : 50
  13. };
  14. var names = new Array();
  15. //计算GDP的最大值
  16. var gdpmax = 0;
  17. for (var i = 0; i < dataset.length; i++) {
  18. var currGdp = d3.max(dataset[i].gdp, function (d) {
  19. return d[1];
  20. });
  21. if (currGdp > gdpmax)
  22. gdpmax = currGdp;
  23. }
  24. var gdpnumb = dataset[0].gdp.length;
  25. for (var j = 0; j < gdpnumb; j++) {
  26. names[j] = (dataset[0].gdp[j])[0];
  27. }
  28. alert(names);
  29. var xScale = d3.scale.linear()
  30. .domain([2000, 2013])
  31. .range([0, width - padding.left - padding.right]);
  32. // var xScale = d3.scale.ordinal()
  33. // .domain(names)
  34. // .rangeRoundBands([0, width - padding.left - padding.right]);
  35. var yScale = d3.scale.linear()
  36. .domain([0, gdpmax * 1.1])
  37. .range([height - padding.top - padding.bottom, 0]);
  38. //创建一个直线生成器
  39. var linePath = d3.svg.line()
  40. .x(function (d) {
  41. return xScale(d[0]);
  42. })
  43. .y(function (d) {
  44. return yScale(d[1]);
  45. })
  46. .interpolate("basis");
  47. //定义两个颜色
  48. var colors = [d3.rgb(0, 0, 255), d3.rgb(0, 255, 0)];
  49. //添加路径
  50. svg.selectAll("path") //选择中所有的
  51. .data(dataset) //绑定数据
  52. .enter() //选择enter部分
  53. .append("path") //添加足够数量的元素
  54. .attr("transform", "translate(" + padding.left + "," + padding.top + ")")
  55. .attr("d", function (d) {
  56. return linePath(d.gdp); //返回直线生成器得到的路径
  57. })
  58. .attr("fill", "none")
  59. .attr("stroke-width", 3)
  60. .attr("stroke", function (d, i) {
  61. return colors[i];
  62. });
  63. //添加垂直于x轴的对齐线
  64. var vLine = svg.append("line")
  65. .attr("class", "focusLine")
  66. .style("display", "none");
  67. //添加一个提示框
  68. var tooltip = d3.select("body")
  69. .append("div")
  70. .attr("class", "tooltip")
  71. .style("opacity", 0.0);
  72. var title = tooltip.append("div")
  73. .attr("class", "title");
  74. var des = tooltip.selectAll(".des")
  75. .data(dataset)
  76. .enter()
  77. .append("div");
  78. var desColor = des.append("div")
  79. .attr("class", "desColor");
  80. var desText = des.append("div")
  81. .attr("class", "desText");
  82. //添加一个透明的监视鼠标事件用的矩形
  83. svg.append("rect")
  84. .attr("class", "overlay")
  85. .attr("x", padding.left)
  86. .attr("y", padding.top)
  87. .attr("width", width - padding.left - padding.right)
  88. .attr("height", height - padding.top - padding.bottom)
  89. .on("mouseover", function () {
  90. tooltip.style("left", (d3.event.pageX) + "px")
  91. .style("top", (d3.event.pageY + 20) + "px")
  92. .style("opacity", 1.0);
  93. vLine.style("display", null);
  94. })
  95. .on("mouseout", function () {
  96. tooltip.style("opacity", 0.0);
  97. vLine.style("display", "none");
  98. })
  99. .on("mousemove", mousemove);
  100. function mousemove() {
  101. /* 当鼠标在透明矩形内滑动时调用 */
  102. //折线的源数组
  103. var data = dataset[0].gdp;
  104. //获取鼠标相对于透明矩形左上角的坐标,左上角坐标为(0,0)
  105. var mouseX = d3.mouse(this)[0] - padding.left;
  106. var mouseY = d3.mouse(this)[1] - padding.top;
  107. //通过比例尺的反函数计算原数据中的值,例如x0为某个年份,y0为GDP值
  108. var x0 = xScale.invert(mouseX);
  109. var y0 = yScale.invert(mouseY);
  110. //对x0四舍五入,如果x0是2005.6,则返回2006;如果是2005.2,则返回2005
  111. x0 = Math.round(x0);
  112. //查找在原数组中x0的值,并返回索引号
  113. var bisect = d3.bisector(function (d) {
  114. return d[0];
  115. }).left;
  116. var index = bisect(data, x0);
  117. //获取年份和gdp数据
  118. var year = x0;
  119. var gdp = [];
  120. for (var k = 0; k < dataset.length; k++) {
  121. gdp[k] = {
  122. country : dataset[k].country,
  123. value : dataset[k].gdp[index][1]
  124. };
  125. }
  126. //设置提示框的标题文字(年份)
  127. title.html("" + year + "年");
  128. //设置颜色标记的颜色
  129. desColor.style("background-color", function (d, i) {
  130. return colors[i];
  131. });
  132. //设置描述文字的内容
  133. desText.html(function (d, i) {
  134. return gdp[i].country + "t" + "" + gdp[i].value + "";
  135. });
  136. //设置提示框的位置
  137. tooltip.style("left", (d3.event.pageX) + "px")
  138. .style("top", (d3.event.pageY + 20) + "px");
  139. //获取垂直对齐线的x坐标
  140. var vlx = xScale(data[index][0]) + padding.left;
  141. //设定垂直对齐线的起点和终点
  142. vLine.attr("x1", vlx)
  143. .attr("y1", padding.top)
  144. .attr("x2", vlx)
  145. .attr("y2", height - padding.bottom);
  146. }
  147. var markStep = 80;
  148. var gMark = svg.selectAll(".gMark")
  149. .data(dataset)
  150. .enter()
  151. .append("g")
  152. .attr("transform", function (d, i) {
  153. return "translate(" + (padding.left + i * markStep) + "," + (height - padding.bottom + 40) + ")";
  154. });
  155. gMark.append("rect")
  156. .attr("x", 0)
  157. .attr("y", 0)
  158. .attr("width", 10)
  159. .attr("height", 10)
  160. .attr("fill", function (d, i) {
  161. return colors[i];
  162. });
  163. gMark.append("text")
  164. .attr("dx", 15)
  165. .attr("dy", ".5em")
  166. .attr("fill", "black")
  167. .text(function (d) {
  168. return d.country;
  169. });
  170. //x轴
  171. var xAxis = d3.svg.axis()
  172. .scale(xScale)
  173. .ticks(5)
  174. .tickFormat(d3.format("d"))
  175. .orient("bottom");
  176. //y轴
  177. var yAxis = d3.svg.axis()
  178. .scale(yScale)
  179. .orient("left");
  180. svg.append("g")
  181. .attr("class", "axis")
  182. .attr("transform", "translate(" + padding.left + "," + (height - padding.bottom) + ")")
  183. .call(xAxis);
  184. svg.append("g")
  185. .attr("class", "y axis")
  186. .attr("transform", "translate(" + padding.left + "," + padding.top + ")")
  187. .call(yAxis);
  188. function updateLineChart() {
  189. this.update = function (updateData) {
  190. //xScale.domain(updateData,function(d){return d.name});
  191. var numValues = updateData.length;
  192. var updategdpmax = 0;
  193. for (var i = 0; i < updateData.length; i++) {
  194. var currGdp = d3.max(updateData[i].gdp, function (d) {
  195. return d[1];
  196. });
  197. if (currGdp > updategdpmax)
  198. updategdpmax = currGdp;
  199. }
  200. yScale = d3.scale.linear()
  201. .domain([0, updategdpmax * 1.1])
  202. .range([height - padding.top - padding.bottom, 0]);
  203. yAxis = d3.svg.axis()
  204. .scale(yScale)
  205. .orient("left");
  206. svg.selectAll("g.y.axis")
  207. .call(yAxis);
  208. svg.selectAll("path") //选择中所有的
  209. .data(updateData) //绑定数据
  210. .transition()
  211. .duration(2000)
  212. .ease("linear")
  213. .attr("d", function (d) {
  214. return linePath(d.gdp); //返回直线生成器得到的路径
  215. });
  216. }
  217. }
  218. return new updateLineChart();
  219. }

刚开始数据刷新了但是坐标轴木有刷新

引入

代码
  1. svg.selectAll("g.y.axis")
  2. .call(yAxis);

以上就是d3.js实现实时刷新折线图的全部内容,希望给大家学习d3.js带来帮助。

相关推荐