【d3.js教程11】气泡图指定颜色

最后更新于:2022-04-01 14:18:17

下面我们将值为负数的圈圈表示成红色 思路是这样的,因为存在一个自动生成半径r的情况,所以在这一步之前数据必须是负数,否则会报错 懒得细细写了  全贴出来自己看 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-23_5742b93a198f6.jpg) ~~~ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/d3.min.js" type="text/javascript" charset="utf-8"></script> <script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script> <style type="text/css"> text{ font-size: 7px; } </style> </head> <body> <script type="text/javascript"> var diameter = 300, //设置宽高 color = d3.scale.category20c(); //设置不同颜色 console.log(color); /*布局设置*/ var bubble = d3.layout.pack() //初始化包图 .sort(null) //后面的数减去前面的数排序,正负都变,null顺序不变 .size([diameter, diameter]) //设置范围 .padding(1.5); //设置间距 /*获取并添加svg元素,并设置宽高*/ var svg = d3.select("body").append("svg") .attr("width", diameter) .attr("height", diameter); /*假定后台传入的数据*/ var data = {贾嫒: -45494.848, 巩嫒: -16720.788, 余嫒: 26449.724, 梁安: 21023.016, 彭安: 3729.6}; /*entries可以将如上类型的格式转换成{key:家园,value:343434}的数组*/ var result = d3.entries(data); /*以下是字符串拼接*/ var startString = "{\"name\": \"flare\",\"children\": ["; //开头字符串 /*以下是绝对值处理部分,将负数变为证书,并且做好标记*/ result.forEach(function(dude){ //遍历result并且拼接 if(dude.value>=0) { startString+="{\"name\":\""+dude.key+"\",\"size\":"+dude.value+",\"flag\":0},"; } else{ startString+="{\"name\":\""+dude.key+"\",\"size\":"+(-dude.value)+",\"flag\":1},"; } }) /*去除最后一个末尾的逗号,这个逗号会影响后面JSON.parse的使用*/ startString = startString.substring(0,startString.length-1); /*拼接尾部字符串*/ startString+="]}"; /*将拼接好的字符串转换成json对象*/ var json2 = JSON.parse(startString); console.log(json2); /*绘图部分*/ /*console.log(classes(json2));*/ var node = svg.selectAll(".node") .data(bubble.nodes(classes(json2)) //绑定数据(配置结点) .filter(function(d) { return !d.children; })) //数据过滤,满足条件返回自身(没孩子返回自身,有孩子不返回,这里目的是去除父节点) .enter().append("g") .attr("class", "node") .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }); //设定g移动 node.append("title") .text(function(d) { if(d.flag==1){ d.value = -d.value; } return d.className + ": " + (d.value); }); //设置移入时候显示数据 数据名和值 node.append("circle") .attr("r", function(d) { console.log(d); return d.r;}) //设置圆的半径 .style("fill", function(d) { var colortip = color(d.value); if(d.flag==1){ colortip = "#ff0005"; } return colortip; }); node.append("text") .attr("dy", ".3em") .style("text-anchor", "middle") //设置文本对齐 .text(function(d) { return d.className.substring(0, d.r / 3); }); //根据半径的大小来截取对应长度字符串(很重要) // Returns a flattened hierarchy containing all leaf nodes under the root. function classes(root) { var classes = []; //存储结果的数组 /*自定义递归函数 * * 第二个参数指传入的json对象 * */ function recurse(name, node) { if (node.children) //如果有孩子结点 (这里的children不是自带的,是json里面有的) { node.children.forEach(function(child) { //将孩子结点中的每条数据 recurse(node.name, child); }) } else {classes.push({ className: node.name, value: node.size,flag:node.flag})}; //如果自身是孩子结点的,将内容压入数组 } recurse(null, root); return {children: classes}; //返回所有的子节点 (包含在children中) } </script> </body> </html> ~~~
';