如何在D3中进行局部填充?

时间:2014-05-25 21:04:22

标签: css d3.js

我有一条曲线在一条斜线上方或下方运行,我想填充线上方和曲线下方的区域,但不是填充线下方和曲线上方的区域,如左图所示。 / p>

同样,很容易像右图一样填充,但我想像左图一样填充。那么,如何摆脱不必要的填充?

svg.append("path").attr("class", "line").attr("d", peak(pp)).style({ fill: peakColor, opacity: 0.5 });

enter image description here

1 个答案:

答案 0 :(得分:0)

好的,这是我想出来的,如果有人关心的话。

var slope = (dp.rightY - dp.leftY) / (dp.rightX - dp.leftX);  // slope of the line
var pp = [];
pp.push({ x: dp.leftX, y: dp.leftY });
var wasAbove = true;   // track if it's above the line
data.forEach(function (d) {
    if (d.x >= dp.leftX && d.x <= dp.rightX) {
        var yAtLine = (d.x - dp.leftX) * slope + dp.leftY;
        if (d.y > yAtLine) {
            if (!wasAbove)
                pp.push({ x: d.x, y: yAtLine });
            pp.push(d);
            wasAbove = true;
        } else if (wasAbove) {
            pp.push({ x: d.x, y: yAtLine });
            wasAbove = false;
        }
    }
});
pp.push({ x: dp.rightX, y: dp.rightY });
var peak = d3.svg.line().x(function (d) { return xScale(d.x) }).y(function (d) { return yScale(d.y) });
svg.append("path").attr("class", "line").attr("d", peak(pp)).style({ fill: peakColor, opacity: 0.5 });