使用D3.js将错误栏添加到分组条形图

时间:2014-03-24 20:36:38

标签: javascript svg d3.js bar-chart

首先,我想知道是否有人知道D3示例显示带错误条的分组条形图?我发现的最接近的事情是:

http://tenxer.github.io/xcharts/examples/(示例自定义Vis类型:错误栏) http://bl.ocks.org/chrisbrich/5044999(积分的误差线)

我有一个分组条形图的工作示例,我想在显示MOE的图表中为每个条形添加一个错误栏。我需要采取哪些步骤才能实现这一目标?我该如何计算线的位置?这是我认为需要做的,请帮我填写我需要采取的步骤。

  1. 创建SVG行

  2. 通过取d.value d.value + MOE和d3.max d.value - MOE

  3. 来计算线的ymin和ymax。
  4. 追加

  5. 这不起作用,但它是否在正确的轨道上?

    var line = d3.svg.line()
        .x(function(d) {return x(d.state); })
        .y0(function(d) {return y(d.value - d.moe); })
        .y1(function(d) {return y(d.value + d.moe); })
        .interpolate("linear");
    
    var errorBarSVG = d3.select("body").append("svg")
    
    var errorBar = errorBarSVG.append("path")
        .attr("d", line(data))
        .attr("stroke", "red")
        .attr("stroke-width", 1.5);
    

1 个答案:

答案 0 :(得分:5)

如果您只想要直线误差条(没有顶部和底部水平线),是的,您可以使用区域或线生成器(只有区域生成器具有y0 / y1方法)。

但是,您不会立即在所有数据上调用路径生成器,您必须创建一个连接到数据的路径选择,然后将数据对象作为一个(区域生成器)或两个传递 - point(行生成器)数组到生成器函数。

这应该有效:

var errorBarArea = d3.svg.area()
    .x(function(d) {return x(d.state); })
    .y0(function(d) {return y(d.value - d.moe); })
    .y1(function(d) {return y(d.value + d.moe); })
    .interpolate("linear");

var errorBarSVG = d3.select("body").append("svg")

var errorBars = errorBarSVG.selectAll("path")
         .data(data);

errorBars.enter().append("path");

errorBars.attr("d", function(d){return errorBarArea([d]);}) 
             //turn the data into a one-element array 
             //and pass it to the area function
    .attr("stroke", "red")
    .attr("stroke-width", 1.5);

这将为每个条创建一个零宽度区域路径,将+/-点连接成一条直线。

如果使用了线生成器函数,则在将数据转换为数组时,必须计算顶部和底部的Y值:

errorBars.attr("d", function(d){
                  return errorBarLine([{x:d.x, y:d.value - d.moe},
                                       {x:d.x, y:d.value + d.moe}]);
               })

或者,您可以使用d3.svg.diagonal创建直线误差线。对角函数专门用于获取单个数据对象并从中提取起始和终止线点;然后,您必须自定义sourcetarget访问器函数,以创建上述代码示例中的对象。

但是,如果您想要一个带有水平顶部和底部行的自定义形状错误栏,则需要编写自己的函数以基于数据对象创建路径"d"属性。我在this answer讨论这样做,对于一个错误栏,形状实际上要简单得多,因为它只是直线。您可能会发现this tutorial on the path directions syntax是一个有用的参考。

最后,您可能还想重新编写条形图代码,以便每个条形图由加入数据的<g>元素表示,然后在其中附加矩形和误差条路径不计算单独的数据连接。