代码之家  ›  专栏  ›  技术社区  ›  kunal

d3 js条形图中的条形高度问题

  •  3
  • kunal  · 技术社区  · 8 年前

    我正在尝试用D3绘制条形图。但是它没有成功工作。我正在尝试以下操作:

       var margin = {top:40, right: 40, bottom: 70, left: 40},
        width = 500 - margin.left - margin.right,
        height = 350 - margin.top - margin.bottom;
    
    var x = d3.scale.ordinal()
        .rangeRoundBands([0, width],.5);
    
    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 tip = d3.tip()
      .attr('class', 'd3-tip')
      .html(function(d) {
        return "<strong>Value:</strong> <span style='color:red'>" + d.ActiveCount + "</span>";
      })
    
    var svg = d3.select("#chart").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 + ")");
    
        svg.call(tip);
    
      var data = [{"CreateMonth":"5","ActiveCount":"6"},
          {"CreateMonth":"6","ActiveCount":"20"},
          {"CreateMonth":"7","ActiveCount":"43"},
          {"CreateMonth":"8","ActiveCount":"125"},
          {"CreateMonth":"9","ActiveCount":"356"},
          {"CreateMonth":"10","ActiveCount":"557"}];
    
    
    x.domain(data.map(function(d) { return d.CreateMonth; }));
    y.domain([0, d3.max(data, function(d) { return d.ActiveCount; })]);
    
    svg.append("g")
        .attr("class", "x axis")
        .attr("transform", "translate(0," + height + ")")
        .call(xAxis)
                .selectAll("text")  
            .style("text-anchor", "end")
            .attr("dx", "-.8em")
            .attr("dy", ".15em")
            .attr("transform", "rotate(-65)");
    
    svg.append("g")
        .attr("class", "y axis")
        .call(yAxis)
      .append("text")
        .attr("transform", "rotate(-90)")
        .attr("y", 6)
        .attr("dy", ".71em")
        .style("text-anchor", "end")
        .text("Active");
    
    svg.selectAll(".bar")
        .data(data)
      .enter().append("rect")
        .attr("class", "bar")
        .attr("x", function(d) { return x(d.CreateMonth); })
        .attr("width", x.rangeBand())
        .attr("y", function(d) { return y(d.ActiveCount); })
        .attr("height", function(d) { return height - y(d.ActiveCount); })
        .on('mouseover', tip.show)
        .on('mouseout', tip.hide)
    

    我使用本教程完成了这个条形图 http://bl.ocks.org/d3noob/8952219 ,但我面临着数组对象中ActiveCount数据不均匀的条形(矩形)高度问题。是否还有其他我无法识别的问题?

    还有,为什么y轴是这样的

    Bar Chart OutPut

    也无法确定工具提示位置的高度,因为我认为是由于一些未排序的数据点或其他问题。。

    如有任何建议,我们将不胜感激

    1 回复  |  直到 8 年前
        1
  •  4
  •   Gerardo Furtado    8 年前

    这里的问题是 ActiveCount 在您的数据中 一串 ,不是数字。

    你必须把它转换成数字。例如,使用一元加号运算符:

    data.forEach(function(d) {
        d.ActiveCount = +d.ActiveCount;
    });
    

    关于轴,您必须删除默认值 fill

    line, path {
        fill: none;
        shape-rendering: crispEdges;
        stroke: black;
    }
    

    这是您的代码和这些更改(没有 d3.tip ):

    var margin = {
        top: 40,
        right: 40,
        bottom: 70,
        left: 40
      },
      width = 500 - margin.left - margin.right,
      height = 350 - margin.top - margin.bottom;
      
    var format = d3.time.format("%b");
    var parser = d3.time.format("%m").parse; 
    
    var x = d3.scale.ordinal()
      .rangeRoundBands([0, width], .5);
    
    var y = d3.scale.linear()
      .range([height, 0]);
    
    var xAxis = d3.svg.axis()
      .scale(x)
      .orient("bottom")
      .tickFormat(function(d){
        return format(parser(d))
      });
    
    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 data = [{
      "CreateMonth": "5",
      "ActiveCount": "6"
    }, {
      "CreateMonth": "6",
      "ActiveCount": "20"
    }, {
      "CreateMonth": "7",
      "ActiveCount": "43"
    }, {
      "CreateMonth": "8",
      "ActiveCount": "125"
    }, {
      "CreateMonth": "9",
      "ActiveCount": "356"
    }, {
      "CreateMonth": "10",
      "ActiveCount": "557"
    }];
    
    data.forEach(function(d) {
      d.ActiveCount = +d.ActiveCount;
    });
    
    x.domain(data.map(function(d) {
      return d.CreateMonth;
    }));
    y.domain([0, d3.max(data, function(d) {
      return d.ActiveCount;
    })]);
    
    svg.append("g")
      .attr("class", "x axis")
      .attr("transform", "translate(0," + height + ")")
      .call(xAxis)
      .selectAll("text")
      .style("text-anchor", "end")
      .attr("dx", "-.8em")
      .attr("dy", ".15em")
      .attr("transform", "rotate(-65)");
    
    svg.append("g")
      .attr("class", "y axis")
      .call(yAxis)
      .append("text")
      .attr("transform", "rotate(-90)")
      .attr("y", 6)
      .attr("dy", ".71em")
      .style("text-anchor", "end")
      .text("Active");
    
    svg.selectAll(".bar")
      .data(data)
      .enter()
      .append("rect")
      .style("fill", "darkorange")
      .attr("class", "bar")
      .attr("x", function(d) {
        return x(d.CreateMonth);
      })
      .attr("width", x.rangeBand())
      .attr("y", function(d) {
        return y(d.ActiveCount);
      })
      .attr("height", function(d) {
        return height - y(d.ActiveCount);
      })
    line,
    path {
      fill: none;
      shape-rendering: crispEdges;
      stroke: black;
    }
    <script src="https://d3js.org/d3.v3.min.js"></script>