曾经想通过chartist或chart.js寻找解决方案,但请保持空白。我正在寻找一种创建折线图并根据数据更改线条颜色的方法。
示例数据集:
[
{time: '3:00:00', speed: 20, direction: 345},
{time: '3:01:00', speed: 0, direction: 0},
{time: '3:02:00', speed: 25, direction: 90},
{time: '3:03:00', speed: 10, direction: 180},
{time: '3:04:00', speed: 5, direction: 0}
]
我正在寻找时间作为x轴,速度作为y轴,然后根据方向更改线段的颜色。似乎大多数图表库(除非我开始深入研究d3),当它们创建折线图时,它们会为整个系列创建一条大线,并且不允许您为该线的各个段设置样式。这里有一个很棒的chartjs示例,但是颜色不是基于数据的(它只是任意颜色集):
https://blog.vanila.io/chart-js-tutorial-how-to-make-gradient-line-chart-af145e5c92f9
您可以创建一个scatter
图表,并使用Plugin Core API直接在画布上绘制线条。 API提供了一系列可用于执行自定义代码的挂钩。
在下面的代码片段中,我使用afterDraw
钩子在数据点之间绘制连接线。其颜色取决于起始数据点的direction
属性。
const rawData = [
{time: '3:00:00', speed: 20, direction: 345},
{time: '3:01:00', speed: 0, direction: 0},
{time: '3:02:00', speed: 25, direction: 290},
{time: '3:03:00', speed: 10, direction: 180},
{time: '3:04:00', speed: 5, direction: 0}
];
const data = rawData.map(o => ({ x: moment(o.time, 'H:mm:ss').toDate().getTime(), y: o.speed}));
const colorsPer100 = ['green', 'orange', 'blue', 'red'];
new Chart(document.getElementById("myChart"), {
type: "scatter",
plugins: [{
afterDraw: chart => {
var ctx = chart.chart.ctx;
var xAxis = chart.scales['x-axis-1'];
var yAxis = chart.scales['y-axis-1'];
chart.config.data.datasets[0].data.forEach((value, index) => {
if (index > 0) {
var valueFrom = data[index - 1];
var xFrom = xAxis.getPixelForValue(valueFrom.x);
var yFrom = yAxis.getPixelForValue(valueFrom.y);
var direction = rawData[index -1].direction;
var xTo = xAxis.getPixelForValue(value.x);
var yTo = yAxis.getPixelForValue(value.y);
ctx.save();
ctx.strokeStyle = colorsPer100[Math.floor(direction / 100)];
ctx.lineWidth = 2;
ctx.beginPath();
ctx.moveTo(xFrom, yFrom);
ctx.lineTo(xTo, yTo);
ctx.stroke();
ctx.restore();
}
});
}
}],
data: {
datasets: [{
label: "My Dataset",
data: data,
borderColor: "rgb(75, 192, 192)"
}]
},
options: {
legend: {
display: false
},
scales: {
xAxes: [{
type: 'time',
time: {
unit: 'minute',
displayFormats: {
minute: 'H:mm:ss'
}
},
}]
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="myChart" height="90"></canvas>