1👍
✅
You can extend an existing line chart as shown by the runnable code snippted below.
This solution is based on the answer https://stackoverflow.com/a/36941860/2358409 that had to be slightly adapted to work with the latest stable version of Chart.js (2.9.3).
const goal = 2;
Chart.defaults.areaConditionalColors = Chart.defaults.line;
Chart.controllers.areaConditionalColors = Chart.controllers.line.extend({
update: function(reset) {
var yAxis = this.chart.scales['y-axis-0'];
var max = Math.max.apply(null, this.chart.data.datasets[0].data);
var yTop = yAxis.getPixelForValue(max);
var yGoal = yAxis.getPixelForValue(goal);
var min = Math.min.apply(null, this.chart.data.datasets[0].data);
var yBottom = yAxis.getPixelForValue(min);
// build a gradient that changes the color at the goal
var ctx = this.chart.chart.ctx;
var gradient = ctx.createLinearGradient(0, yTop, 0, yBottom);
var ratio = Math.min((yGoal - yTop) / (yBottom - yTop), 1);
gradient.addColorStop(0, 'green');
gradient.addColorStop(ratio, 'green');
gradient.addColorStop(ratio, 'red');
gradient.addColorStop(1, 'red');
this.chart.data.datasets[0].backgroundColor = gradient;
return Chart.controllers.line.prototype.update.apply(this, arguments);
}
});
new Chart('myChart', {
type: 'areaConditionalColors',
data: {
labels: ['FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED', 'THU'],
datasets: [{
label: 'Hours',
backgroundColor: 'green',
data: [0, 3, 0, 9, 4, 0, 0],
fill: '+1'
},
{
label: 'Goal',
backgroundColor: 'rgba(84, 232, 198, 0.8)',
data: [goal, goal, goal, goal, goal, goal, goal],
fill: '-1'
}]
},
options: {
legend: {
onClick: e => e.stopPropagation()
},
tooltips: {
mode: 'x'
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="myChart" height="80"></canvas>
Source:stackexchange.com