我尝试了这种不同的方式,但似乎没有任何工作.这是我目前拥有的
var vis = d3.select("#chart").append("svg") .attr("width",1000) .attr("height",667),scaleX = d3.scale.linear() .domain([-30,30]) .range([0,600]),scaleY = d3.scale.linear() .domain([0,50]) .range([500,0]),poly = [{"x":0,"y":25},{"x":8.5,"y":23.4},{"x":13.0,"y":21.0},{"x":19.0,"y":15.5}]; vis.selectAll("polygon") .data(poly) .enter() .append("polygon") .attr("points",function(d) { return [scaleX(d.x),scaleY(d.y)].join(",")}) .attr("stroke","black") .attr("stroke-width",2);
我假设这里的问题在于我将点数据定义为单个点对象的数组,或者与我如何编写.attr(“points”,…)的函数有关
我一直在网路上看到一个教程或如何绘制一个简单的多边形的例子,但我似乎找不到.
解决方法
多边形看起来像:< polygon points =“200,10 250,190 160,210”/>
所以,你的完整的poly数组应该会产生一个长的字符串,它将创建一个多边形.因为我们在谈论一个多边形,所以数据连接也应该是只有一个元素的数组.这就是为什么下面的代码显示:data([poly])如果你想要两个相同的多边形,你会将其更改为数据([poly,poly]).
目标是使用4个对象从数组中创建一个字符串.我用这个地图和另一个加入:
poly = [{"x":0.0,"y":25.0},"y":15.5}]; vis.selectAll("polygon") .data([poly]) .enter().append("polygon") .attr("points",function(d) { return d.map(function(d) { return [scaleX(d.x),"); }).join(" "); }) .attr("stroke",2);
见工作小提琴:http://jsfiddle.net/4xXQT/