d3js绘制不正确坐标的图形

时间:2013-10-04 18:01:21

标签: javascript html svg d3.js

我试图绘制简单的d3js图。我通过绘制轴,甚至绘制了数据,但数据没有出现在预期的位置。

根据我下面的json数据

var d1 = [{
        value1: "30",
        value2: "10"
    }];

我正试图在coordinates x axis 30 and y axis 10处绘制一个圆圈,但图表上的圆圈会出现在其他地方。

这是jsfiddle demo

这是我的代码

    var d1 = [{
            value1: "30",
            value2: "10"
        }];



function Update(){
   var circles = vis.selectAll("circle").data(d1)
    circles
        .enter()
            .insert("svg:circle")
                .attr("cx", function (d) { return d.value1; })
                .attr("cy", function (d) { return d.value2; })
                .style("fill", "red")
    circles
        .transition().duration(1000)
            .attr("cx", function (d) { return d.value1; })
            .attr("cy", function (d) { return d.value2; })
            .attr("r", function (d) { return 5; })

    circles.exit ()
        .transition().duration(1000)
            .attr("r", 0)
                .remove ();


}



/*************************************************/


/*******************Real Stuff starts here*******************/

var vis = d3.select("#visualisation"),
  WIDTH = 600,
  HEIGHT = 400,
  MARGINS = {
    top: 20,
    right: 20,
    bottom: 20,
    left: 50
  },
  xRange = d3.scale.linear().range([MARGINS.left, WIDTH - MARGINS.right]).domain([0,100]),
  yRange = d3.scale.linear().range([HEIGHT - MARGINS.top, MARGINS.bottom]).domain([0,300]),


  xAxis = d3.svg.axis() // generate an axis
       .scale(xRange) // set the range of the axis
       .tickSize(5) // height of the ticks
       .tickSubdivide(true), // display ticks between text labels
  yAxis = d3.svg.axis() // generate an axis
       .scale(yRange) // set the range of the axis
       .tickSize(5) // width of the ticks
       .orient("left") // have the text labels on the left hand side
       .tickSubdivide(true); // display ticks between text labels 

function init() {
  vis.append("svg:g") // add a container for the axis
  .attr("class", "x axis") // add some classes so we can style it
  .attr("transform", "translate(0," + (HEIGHT - MARGINS.bottom) + ")") // move it into position
  .call(xAxis); // finally, add the axis to the visualisation

  vis.append("svg:g")
    .attr("class", "y axis")
    .attr("transform", "translate(" + (MARGINS.left) + ",0)")
    .call(yAxis);
}
init();





$('#btn').click(function(){
    Update();
});

4 个答案:

答案 0 :(得分:1)

您的圆圈出现在像素(30,10)处,但这与您的轴标记的地点30,10不对应。使用刻度来设置点的位置。

            .attr("cx", function (d) { return xRange(d.value1); })
            .attr("cy", function (d) { return yRange(d.value2); })

答案 1 :(得分:1)

如果你

,它会起作用
  • 将数字定义为数字而非字符串(即value1: 30而不是value1: "30")和
  • 使用您定义的比例(即return xRange(d.value1)代替return d.value1)。

工作jsfiddle here

答案 2 :(得分:0)

您需要将xScaleyScale应用于坐标,以将其转换为绘图空间。

请参阅this jsFiddle

.attr("cx", function (d) { return xRange(d.value1); })
.attr("cy", function (d) { return yRange(d.value2); })

答案 3 :(得分:0)

实际上它工作正常。只是左上角是(0,0)而不是左下角(我怀疑你必须假设)。

将x,y设置为0.圆圈将出现在左上角。