首先,我想知道是否有人知道D3示例显示带错误条的分组条形图?我发现的最接近的事情是:
http://tenxer.github.io/xcharts/examples/(示例自定义Vis类型:错误栏) http://bl.ocks.org/chrisbrich/5044999(积分的误差线)
我有一个分组条形图的工作示例,我想在显示MOE的图表中为每个条形添加一个错误栏。我需要采取哪些步骤才能实现这一目标?我该如何计算线的位置?这是我认为需要做的,请帮我填写我需要采取的步骤。
创建SVG行
通过取d.value d.value + MOE和d3.max d.value - MOE
追加
这不起作用,但它是否在正确的轨道上?
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);
答案 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
创建直线误差线。对角函数专门用于获取单个数据对象并从中提取起始和终止线点;然后,您必须自定义source
和target
访问器函数,以创建上述代码示例中的对象。
但是,如果您想要一个带有水平顶部和底部行的自定义形状错误栏,则需要编写自己的函数以基于数据对象创建路径"d"
属性。我在this answer讨论这样做,对于一个错误栏,形状实际上要简单得多,因为它只是直线。您可能会发现this tutorial on the path directions syntax是一个有用的参考。
最后,您可能还想重新编写条形图代码,以便每个条形图由加入数据的<g>
元素表示,然后在其中附加矩形和误差条路径不计算单独的数据连接。