0

単純な d3js グラフを描画しようとしていました。軸を描画し、データをプロットしましたが、データが期待される場所に表示されません。

以下の私のjsonデータによると

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

で円をプロットしようとしていcoordinates x axis 30 and y axis 10ますが、グラフ上の円は他の場所に表示されます。

これがjsfiddleデモです

これが私のコードです

    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

4 に答える 4

1

円はピクセル (30,10) に表示されていますが、軸によってラベル付けされた場所 30,10 に対応していません。スケールを使用してポイントの位置を設定します。

            .attr("cx", function (d) { return xRange(d.value1); })
            .attr("cy", function (d) { return yRange(d.value2); })
于 2013-10-04T18:09:27.920 に答える
1

次の場合に機能します

  • 数値を文字列ではなく数値として (つまりvalue1: 30の代わりにvalue1: "30")定義し、
  • 定義したスケールを使用します (つまりreturn xRange(d.value1)、 の代わりにreturn d.value1)。

ここでjsfiddle を使用します。

于 2013-10-04T18:10:19.433 に答える
0

実際、それはうまく機能しています。左上隅が(0,0)であり、左下ではないというだけです(私が推測しているように、あなたは推測しているに違いありません)。

x、y の両方を 0 に設定します。円は左上隅に表示されます。

于 2013-10-04T18:17:47.913 に答える