-2

この水平棒グラフを基本的に垂直棒グラフに回転させようとしていますが、その方法がわかりません。通常の縦棒グラフを作成することはできますが、負の値を入力してyと高さを計算しようとすると、すべての地獄が解き放たれます。これが私のフィドルです。(少なくとも、y軸を作成することができました(私は思います)。)

私はここで何が間違っているのですか?

var data = [{"letter":"A",'frequency':10},{"letter":"B","frequency":-5},{"letter":"C","frequency":7}];

var margin = {top: 20, right: 20, bottom: 30, left: 40}, width = 750 - margin.left - margin.right, height = 500 - margin.top - margin.bottom;
var x = d3.scale.ordinal().rangeRoundBands([0, width], .1);
var y = d3.scale.linear().range([height, 0]);
var xAxis = d3.svg.axis()
            .scale(x)
            .orient("bottom");
var yAxis = d3.svg.axis()
            .scale(y)
            .orient("left");

var svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
   .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var x0 = Math.max(-d3.min(data), d3.max(data));
     x.domain(data.map(function(d) { return d.letter; }));
     y.domain([d3.min(data, function(d) { return d.frequency; }), d3.max(data, function(d) { return d.frequency; })]);

  svg.append("g")
     .attr("class", "x axis")
     .attr("transform", "translate(0," + height + ")")
     .call(xAxis);
  svg.append("g")
     .attr("class", "y axis")
     .call(yAxis);

  svg.selectAll(".bar")
      .data(data).enter().append("rect")
      .attr("class", "bar")
      .attr("x", function(d, i) { return x(d.letter); })
      .attr("y", function(d, i) { return x(Math.min(0, d.frequency));})
      .attr("width", x.rangeBand())
      .attr("height", function(d) { return Math.abs(x(d.frequency) - x(0)); });
4

1 に答える 1

1

ここには2つの問題があるようです。

  1. タイプミス:.attr("y", function(d, i) { return x(...);})はになります.attr("y", function(d, i) { return y(...);})。属性のスケールについても同じことが言えheightます。

  2. X軸の0ベースからY軸の0ベースへの変更。X軸にゼロベースのバーがある場合x、バーの属性はですx(0)。Y軸に0ベースのバーがある場合y、バーの属性はではありません y(0)y(value)(バーの「ベース」は長方形の前縁ではなくなったため)、このコードでは使用する必要がありますMath.max(0, value)y(value)の代わりに正の値を与える) Math.min(0, value)

    svg.selectAll(".bar")
      // ...snip...
      .attr("y", function(d, i) { return y(Math.max(0, d.frequency));})
      .attr("height", function(d) { return Math.abs(y(d.frequency) - y(0)); });
    

更新されたフィドルを参照してください:http://jsfiddle.net/pYZn8/5/

于 2013-03-25T17:34:23.243 に答える