为每个点设置一个阈值
Set a threshold for each point
我已经使用 C3.js 创建了一个与此非常相似的条形图,但我面临的问题是为条形图上的每个点设置一个关于 x 轴值的阈值。例如,当 GOAL 在 x 轴上为 < 10%
时,y 轴上的 10%
标记上应该有一条虚线,后续值也应该发生同样的事情,即 <3%, <2% and <1%
.
我的问题是,如何创建阈值或在图表上设置标记,就像在模型上一样?提前致谢。
您可以使用 c3 用来绘制条形图的相同函数来确定在何处绘制目标线,就像这样
...
// where to draw the target lines for each data point
var scalingFactors = [0.1, 0.03, 0.02, 0.01]
// svg layer for each bar series
var barsLayers = chart.internal.main.selectAll('.' + c3.chart.internal.fn.CLASS.bars)[0]
var bars = chart.internal.main.selectAll('.' + c3.chart.internal.fn.CLASS.bar)[0];
// use the same function c3 uses to get each bars corners
var getPoints = chart.internal.generateGetBarPoints(chart.internal.getShapeIndices(chart.internal.isBarType));
// just in case there are multiple series
chart.internal.data.targets.forEach(function (series, i) {
// for each point in the series
series.values.forEach(function (d, j) {
// highlight if over threshold
if (d.value > scalingFactors[j])
d3.select(bars[j]).classed('crossed', true);
// get the position for our target lines
var value = d.value;
d.value = scalingFactors[j];
var pos = getPoints(d, j);
d.value = value;
var posTopLeft = pos[1]
var posTopRight = pos[2]
// draw target lines
d3.select(barsLayers[i]).append("line")
.attr("x1", posTopLeft[0] - 10)
.attr("y1", posTopLeft[1])
.attr("x2", posTopRight[0] + 10)
.attr("y2", posTopRight[1])
.attr("stroke-width", 1)
.style("stroke-dasharray", ("6, 4"));
})
})
CSS
.crossed {
fill: orange !important;
}
Fiddle - http://jsfiddle.net/puvhLb6x/
我已经使用 C3.js 创建了一个与此非常相似的条形图,但我面临的问题是为条形图上的每个点设置一个关于 x 轴值的阈值。例如,当 GOAL 在 x 轴上为 < 10%
时,y 轴上的 10%
标记上应该有一条虚线,后续值也应该发生同样的事情,即 <3%, <2% and <1%
.
我的问题是,如何创建阈值或在图表上设置标记,就像在模型上一样?提前致谢。
您可以使用 c3 用来绘制条形图的相同函数来确定在何处绘制目标线,就像这样
...
// where to draw the target lines for each data point
var scalingFactors = [0.1, 0.03, 0.02, 0.01]
// svg layer for each bar series
var barsLayers = chart.internal.main.selectAll('.' + c3.chart.internal.fn.CLASS.bars)[0]
var bars = chart.internal.main.selectAll('.' + c3.chart.internal.fn.CLASS.bar)[0];
// use the same function c3 uses to get each bars corners
var getPoints = chart.internal.generateGetBarPoints(chart.internal.getShapeIndices(chart.internal.isBarType));
// just in case there are multiple series
chart.internal.data.targets.forEach(function (series, i) {
// for each point in the series
series.values.forEach(function (d, j) {
// highlight if over threshold
if (d.value > scalingFactors[j])
d3.select(bars[j]).classed('crossed', true);
// get the position for our target lines
var value = d.value;
d.value = scalingFactors[j];
var pos = getPoints(d, j);
d.value = value;
var posTopLeft = pos[1]
var posTopRight = pos[2]
// draw target lines
d3.select(barsLayers[i]).append("line")
.attr("x1", posTopLeft[0] - 10)
.attr("y1", posTopLeft[1])
.attr("x2", posTopRight[0] + 10)
.attr("y2", posTopRight[1])
.attr("stroke-width", 1)
.style("stroke-dasharray", ("6, 4"));
})
})
CSS
.crossed {
fill: orange !important;
}
Fiddle - http://jsfiddle.net/puvhLb6x/