Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何创建具有负值的柱状图?_Javascript_D3.js - Fatal编程技术网

Javascript 如何创建具有负值的柱状图?

Javascript 如何创建具有负值的柱状图?,javascript,d3.js,Javascript,D3.js,我试图将水平条形图旋转为垂直条形图,但不知道如何实现。我可以创建一个普通的柱状图,但一旦我尝试输入负值并计算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:

我试图将水平条形图旋转为垂直条形图,但不知道如何实现。我可以创建一个普通的柱状图,但一旦我尝试输入负值并计算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)); });

看起来这里有两个问题:

  • 输入错误:
    .attr(“y”,函数(d,i){return x(…);})
    现在应该是
    .attr(“y”,函数(d,i){return y(…);})
    。对于
    height
    属性中的比例也是如此

  • 从X轴上的0基准更改为Y轴上的0基准。如果X轴上有一个基于零的条形图,则条形图的
    X
    属性为
    X(0)
    。对于Y轴上基于0的条形图,条形图的
    Y
    属性不是
    Y(0)
    ,而是
    Y(值)
    (因为条形图的“底部”不再是矩形的前缘)-因此在该代码中,需要使用
    Math.max(0,值)
    (这将为正值提供
    Y(值)
    )而不是
    Math.min(0,值)


  • 参见更新的fiddle:

    行var x0=Math.max(-d3.min(数据),d3.max(数据));不再有贡献,因为数据不再是数字数组,因此x0不再是数字。谢谢@京3142:你说得对。我的坏习惯是保持这种状态。相关:
    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)); });