d3.js应用笔记①
想展示7项测验的得分情况,直方图太过死板,故使用熟悉的force-directed阉割links之后的graph来表示,好处有两个
- 对于平板更加友好,圆形的图像更加适合平板的展示
- 动态效果碰来碰去很有意思,直方图比较死板,动态的force图形可以拖来拖去增加趣味性
基本绘制思路:
画布准备:定义绘制图像的画布
var w = 960, h = 550, r = 6, fill = d3.scale.category10(); var svg = d3.select("#result").append("svg:svg") .attr("width", w) .attr("height", h);
引用布局并定义
var force = d3.layout.force() .gravity(0.07) .charge(-800) .linkDistance(130) .size([w, h]);
外部数据的绑定
d3.json("data.json", function(json) { var node = svg.selectAll("circle") .data(json.tests) .enter().append("g") .attr("class", "node") .on("mouseover", mouseover) .on("mouseout", mouseout) .call(force.drag); })
定义node节点
node.append("svg:circle") .attr("r", function(d) { return d.score; }) .style("fill", function(d) { return fill(d.group); }); force.nodes(json.tests) .on("tick", tick) .start(); function tick() { node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }); }
增加特征
node.append("text") .attr("dy", ".35em") .attr("text-anchor", "middle") .attr("class", "node-text") .style("fill","#fff") .text(function(d) { return d.score; });
- 各种堪错
遇到的问题:
始终无法显示text内容的问题:
当时enter()之后并没有添加
.append("g") .attr("class", "node")
直接append的circle,在添加text的过程中,在控制台明明可以看到text-content数据,但是始终不显示text的内容,将append独立,并添加以上代码后,问题解决。
应该是这样做之后,circle和text的等级就是平级,都在g之下,这样就可以显示了。耗时较长,注意该问题。
颜色的问题: 一开始始终不会使用颜色的scale,现在看应该是当时定义的变量和后面的变量引用不符:
fill = d3.scale.category10(); … .style("fill", function(d) { return fill(d.group); });
使text文字在图形中居中的代码:
.attr("text-anchor", "middle") .attr("class", "node-text")