【问题标题】:Chart.js shaded regionsChart.js 阴影区域
【发布时间】:2016-04-23 22:53:14
【问题描述】:

Chart.js (http://www.chartjs.org/docs/) 可以使用“fillColor”属性填充折线图下方的颜色(填充折线图本身和 x 轴之间的区域)。

我想知道的是 Chart.js 是否可以配置为创建阴影区域,如下所示:

http://peltiertech.com/Excel/pix5/HorizBands09.png

谢谢。

【问题讨论】:

  • 我不认为您需要的条带化已经在 API 中。但是您可以在绘制图表后通过设置context.globalCompositeOperation = 'destination-over' 并使用数据点通过context.fillRect 应用条纹来绘制条纹。注意:“destination over”合成将导致您的条纹在现有内容下绘制。完成后确保将合成设置回默认值:context.globalCompositeOperation = 'source-over'

标签: javascript charts html5-canvas chart.js


【解决方案1】:

折线图的阴影区域

您可以扩展图表来执行此操作。


预览


脚本

Chart.types.Line.extend({
    name: "LineAlt",
    initialize: function (data) {
        Chart.types.Line.prototype.initialize.apply(this, arguments);

        var ranges = [
            {
                start: 100,
                end: 75,
                color: 'rgba(250,0,0,0.5)'
            },
            {
                start: 75,
                end: 50,
                color: 'rgba(0,250,0,0.5)'
            },
            {
                start: 50,
                end: 25,
                color: 'rgba(0,0,250,0.5)'
            },
            {
                start: 25,
                end: 0,
                color: 'rgba(250,250,0,0.5)'
            }
        ];

        var scale = this.scale;
        var rangesStart = scale.calculateY(ranges[0].start);
        var rangesEnd = scale.calculateY(ranges[ranges.length - 1].end);
        var gradient = this.chart.ctx.createLinearGradient(0, rangesStart, 0, rangesEnd);

        ranges.forEach(function (range) {
            gradient.addColorStop((scale.calculateY(range.start) - rangesStart) / (rangesEnd - rangesStart), range.color);
            gradient.addColorStop((scale.calculateY(range.end) - rangesStart) / (rangesEnd - rangesStart), range.color);
        })

        this.datasets[0].fillColor = gradient;
    }
});

然后

...
new Chart(ctx).LineAlt(data);

如果你想遮蔽整个背景,请使用

var originalDraw = scale.draw;
scale.draw = function() {
    originalDraw.apply(this, arguments);

  ctx.save();
  ctx.fillStyle = gradient;
  ctx.fillRect(scale.calculateX(0), scale.startPoint, scale.width, scale.endPoint - scale.startPoint);
  ctx.restore();
}

而不是this.datasets[0].fillColor = gradient;


小提琴(下一行)-http://jsfiddle.net/61vg048r/

小提琴(整个背景)-http://jsfiddle.net/u4Lk7xns/

【讨论】:

  • 请原谅我的无知,但是我将如何扩展颜色条以覆盖整个图表(如原始帖子中显示的链接中所示),而不是在条“击中”折线图时简单地停止.谢谢
  • 非常感谢。这正是我所需要的!
  • 谢谢 .. 在角度 2 中寻找解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 2018-07-08
  • 2019-07-10
  • 2012-09-25
  • 1970-01-01
  • 2016-06-29
  • 2013-05-30
相关资源
最近更新 更多