d3.js——给柱形图添加事件出现的问题总结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了d3.js——给柱形图添加事件出现的问题总结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4966字,纯文字阅读大概需要8分钟。
内容图文
首先做出一个动态的柱形图(这儿用的d3.js的版本是v3,用v4的话有些函数会发生变化)
效果图:
代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>histogramTransitionEvent</title> <style> .axis path, .axis line{ fill: none; stroke: black; shape-rendering: crispEdges; } .axis text { font-family: sans-serif; font-size: 11px; } .MyText { fill: white; text-anchor: middle; } </style> </head> <body> <script src="d3.js"></script> <script> //添加svg画布var width=400; var height=400; //在 body 里添加一个 SVG 画布var svg = d3.select("body") .append("svg") .attr("width",width) .attr("height",height); //画布周边的空白var padding={ left:30, right:30, top:20, bottom:20 }; //定义一个数组var dataset=[10,20,30,40,33,24,12,5]; //x轴的比例尺var xScale=d3.scale.ordinal() // 使用了d3.scale.ordinal() 它支持范围分档。与定量比例尺(如d3.scale.linear())返回连续的范围值不同,序数比例尺使用的是离散范围值,也就是输出值是事先就确定好的。// 映射范围时,可以使用range(),也可以使用rangeBands()。后者接收一个最小值和一个最大值,然后根据输入值域的长度自动将其切分成相等的块或“档”。0.2也就是档间距为每一档宽度的20%。 .domain(d3.range(dataset.length)) .rangeRoundBands([0,width-padding.left-padding.right]); //y轴的比例尺var yScale = d3.scale.linear() .domain([0,d3.max(dataset)]) .range([height-padding.top-padding.bottom,0]); //定义坐标轴//定义x轴var xAxis = d3.svg.axis() .scale(xScale) .orient("bottom"); //定义y轴var yAxis = d3.svg.axis() .scale(yScale) .orient("left"); //添加矩形和文字元素var rectPadding = 4; var rects = svg.selectAll(".MyRect") .data(dataset) .enter() .append("rect") .attr("class","MyRect") .attr("transform","translate("+padding.left+","+padding.top+")") .attr("x",function(d,i){ return xScale(i)+rectPadding/2; }) .attr("width",xScale.rangeBand()-rectPadding) .attr("y",function(d){ var min = yScale.domain()[0]; return yScale(min); }) .attr("height", function(d){ return 0; }) .transition() .delay(function(d,i){ return i * 200; }) .duration(2000) .ease("bounce") .attr("y",function(d){ return yScale(d); }) .attr("height",function(d){ return height-padding.top-padding.bottom-yScale(d); })//console.log(width-padding.left-padding.right);//添加文字元素var texts = svg.selectAll(".MyText") .data(dataset) .enter() .append("text") .attr("class","MyText") .attr("transform","translate("+padding.left+","+padding.top+")") .attr("x",function(d,i){ return xScale(i)+rectPadding/2; }) .attr("y",function(d){ var min = yScale.domain()[0]; // console.log(yScale(min));return yScale(min); }) .transition() .delay(function(d,i){ return i*200; }) .duration(2000) .ease("bounce") .attr("y",function(d){ return yScale(d); }) .attr("dx",function(){ return (xScale.rangeBand()-rectPadding)/2; }) .attr("dy",function(){ return 20; }) .text(function(d){ return d; }); //添加坐标轴元素//添加x轴 svg.append("g") .attr("class","axis") .attr("transform","translate("+padding.left+","+(height-padding.bottom)+")") .call(xAxis); //添加y轴 svg.append("g") .attr("class","axis") .attr("transform","translate("+padding.left+","+padding.top+")") .call(yAxis); </script> </body> </html>
现在像个这个动态的柱形图添加mouseover和mouseout事件。
做法:
1.去掉style样式中的.MyText类,直接在添加矩形的时候添加颜色属性
2.在添加矩形的时候添加事件
... // 添加矩形和文字元素 var rectPadding = 4; var rects = svg.selectAll(".MyRect") .data(dataset) .enter() .append("rect") .attr("class","MyRect") .attr("transform","translate("+padding.left+","+padding.top+")") .attr("x",function(d,i){ return xScale(i)+rectPadding/2; }) .attr("width",xScale.rangeBand()-rectPadding) .attr("y",function(d){ var min = yScale.domain()[0]; return yScale(min); }) .attr("height", function(d){ return 0; }) .transition() .delay(function(d,i){ return i * 200; }) .duration(2000) .ease("bounce") .attr("y",function(d){ return yScale(d); }) .attr("height",function(d){ return height-padding.top-padding.bottom-yScale(d); }) .attr("fill","steelblue") //添加事件 .on("mouseover",function(d,i){ d3.select(this) .attr("fill","yellow"); }) .on("mouseout",function(d,i){ d3.select(this) .transition() .duration(500) .attr("fill","steelblue"); }); ...
但是这样会报错,会显示on不是一个函数
后来知道应该把on事件放在transition()之前,但是为啥这么做可以现在还不知道
... // 添加矩形和文字元素 var rectPadding = 4; var rects = svg.selectAll(".MyRect") .data(dataset) .enter() .append("rect") .attr("class","MyRect") .attr("transform","translate("+padding.left+","+padding.top+")") .attr("x",function(d,i){ return xScale(i)+rectPadding/2; }) .attr("width",xScale.rangeBand()-rectPadding) //添加事件在 transition()之前 .on("mouseover",function(d,i){ d3.select(this) .attr("fill","yellow"); }) .on("mouseout",function(d,i){ d3.select(this) .transition() .duration(500) .attr("fill","steelblue"); }) .attr("y",function(d){ var min = yScale.domain()[0]; return yScale(min); }) .attr("height", function(d){ return 0; }) .transition() .delay(function(d,i){ return i * 200; }) .duration(2000) .ease("bounce") .attr("y",function(d){ return yScale(d); }) .attr("height",function(d){ return height-padding.top-padding.bottom-yScale(d); }) .attr("fill","steelblue"); ...
最终效果图:
这里面矩形图的教程来源:http://d3.decembercafe.org/pages/lessons/9.html
原文:http://www.cnblogs.com/weiyangoo/p/7273732.html
内容总结
以上是互联网集市为您收集整理的d3.js——给柱形图添加事件出现的问题总结全部内容,希望文章能够帮你解决d3.js——给柱形图添加事件出现的问题总结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。