【问题标题】:d3.js How to add lines to a bar chartd3.js 如何在条形图中添加线条
【发布时间】:2012-10-25 05:20:01
【问题描述】:

我有一个包含 4 个值的数据集。 [A B C D]。目前,它们显示在条形图中,每个值一个条形。现在由于值 c 和 d 是平均值,我想将它们显示为 a 和 b 的条后面的线。 d3可以做到这一点吗?如何在同一个数据数组中切换条形或线形显示?

感谢您的帮助。

【问题讨论】:

    标签: javascript charts d3.js bar-chart


    【解决方案1】:

    从您的数据中创建具有两个属性的对象列表:

    var data = [1,2,3,4];
    var objects = data.slice(0, data.length/2).map(
      function(d,i) { return { value:d, average:data[i+data.length/2] }; } 
    );
    

    然后你可以做这样的事情(未测试):

    var bars = chart.selectAll("g.bar")
       .data(objects)
      .enter().append("g")
        .attr("class", "bar")
        .attr("transform", function(d,i) { return "translate("+(i*10)+",0)"; });
    
    
    bars.append("rect")
        .attr("x", 0)
        .attr("y", function(d,i) { return height - d.value; })
        .attr("width", 10)
        .attr("height", function(d,i) { return d.value; });
    
    bars.append("line")
        .attr("x1", 0)
        .attr("y1", function(d,i) { return height - d.average; })
        .attr("x2", 10)
        .attr("y2", function(d,i) { return height - d.average; });
    

    【讨论】:

      【解决方案2】:

      我在这里发布一个示例,因为没有一个答案在 jsbin 或 jsfiddle 等中提供带线条的条形图的工作示例。
      http://jsbin.com/gisinomo/1/edit

      该示例是 d3 wiki 上简单条形图的一个分支。
      http://bl.ocks.org/mbostock/3885304

      CSS

      body {
        font: 10px sans-serif;
      }
      
      .axis path,
      .axis line {
        fill: none;
        stroke: #000;
        shape-rendering: crispEdges;
      }
      
      .bar {
        fill: steelblue;
      }
      
      .x.axis path {
        display: none;
      }
      
      .line {
        fill: none;
        stroke: #444;
        stroke-width: 1.5px;
      }
      

      JavaScript

      var data = [{ "letter": "A", "frequency": .08167},
      { "letter": "B", "frequency": .01492},
      { "letter": "C", "frequency": .02780},
      { "letter": "D", "frequency": .04253},
      { "letter": "E", "frequency": .12702},
      { "letter": "F", "frequency": .02288},
      { "letter": "G", "frequency": .02022},
      { "letter": "H", "frequency": .06094},
      { "letter": "I", "frequency": .06973},
      { "letter": "J", "frequency": .00153},
      { "letter": "K", "frequency": .00747},
      { "letter": "L", "frequency": .04025},
      { "letter": "M", "frequency": .02517},
      { "letter": "N", "frequency": .06749},
      { "letter": "O", "frequency": .07507},
      { "letter": "P", "frequency": .01929},
      { "letter": "Q", "frequency": .00098},
      { "letter": "R", "frequency": .05987},
      { "letter": "S", "frequency": .06333},
      { "letter": "T", "frequency": .09056},
      { "letter": "U", "frequency": .02758},
      { "letter": "V", "frequency": .01037},
      { "letter": "W", "frequency": .02465},
      { "letter": "X", "frequency": .00150},
      { "letter": "Y", "frequency": .01971},
      { "letter": "Z", "frequency": .00074}];
      
      var margin = {top: 20, right: 20, bottom: 30, left: 40},
          width = 960 - margin.left - margin.right,
          height = 500 - margin.top - margin.bottom;
      
      var formatPercent = d3.format(".0%");
      
      var x = d3.scale.ordinal()
          .rangeRoundBands([0, width], .1);
      
      var x2 = d3.scale.ordinal()
        .rangeBands([0, width], 0);
      
      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")
          .tickFormat(formatPercent);
      
      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 + ")");
      
      
        data.forEach(function(d) {
          d.frequency = +d.frequency;
        });
      
        x.domain(data.map(function(d) { return d.letter; }));
        x2.domain(data.map(function(d) { return d.letter; }));
        y.domain([0, 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)
          .append("text")
            .attr("transform", "rotate(-90)")
            .attr("y", 6)
            .attr("dy", ".71em")
            .style("text-anchor", "end")
            .text("Frequency");
      
        svg.selectAll(".bar")
            .data(data)
          .enter().append("rect")
            .attr("class", "bar")
            .attr("x", function(d) { return x(d.letter); })
            .attr("width", x.rangeBand())
            .attr("y", function(d) { return y(d.frequency); })
            .attr("height", function(d) { return height - y(d.frequency); });
      
      var dataSum = d3.sum(data, function(d) { return d.frequency; }); 
      
       var line = d3.svg.line()
          .x(function(d, i) { 
            return x2(d.letter) + i; })
          .y(function(d, i) { return y(dataSum/data.length); }); 
      
        svg.append("path")
            .datum(data)
            .attr("class", "line")
            .attr("d", line);
      

      【讨论】:

      • @Martialp - 该行是原始的。我已经更新了小提琴和代码return x2(d.letter) 让它再次显示。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      相关资源
      最近更新 更多