Chart.js:不同的数据集大小
Chart.js: different dataset size
我需要显示我认为很常见的用例:折线图显示例如涵盖一周的每日和每小时平均值。
一个数据集显然有7个数据点,另一个有168个。
我找不到允许这样做的示例或记录的选项。当然 - 我几乎可以配置任何关于外观和感觉的东西,但是当涉及到数据大小时,两个数据集都应该具有与标签一样多的数据点。
我只想为数据点较少的数据集添加标签(在这个例子中:每日平均值),而另一个(168 个数据点)只会画一条细线,不应该在图表(无竖线等)[=11=]
Chart.js可以吗?
只要您的数据集中至少有 1 个可以使用备用 scatter chart dataset. Let me walk you through an example where I show the daily avg as bars and the hourly avg as a line (aka, a mixed chart type).
来表达,您所描述的内容实际上可以用 chart.js 实现
首先,为一周中的每一天配置一个带有标签的条形图,并提供数据的每日平均值作为您的第一个数据集。
接下来,创建另一个数据集,但将其 type
属性 设置为 'line'
。由于我们想要使用不同的 X 轴和一组不同的标签,因此您必须使用 {x: 0, y: 2}
符号来表达您的数据。这将允许您绕过使用上面定义的标签的比例。
最后,在您的 options.scales
配置中,定义 2 xAxes
比例并将您的第二个数据集关联到第二个 X 轴比例(同时将其 display
属性 设置为false
所以你看不到任何第二个刻度)。
您最终得到的图表配置如下所示。
var ctx = document.getElementById("canvas").getContext("2d");
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
datasets: [{
type: 'bar',
label: 'Daily Avg',
backgroundColor: chartColors.red,
data: dailyAvgData,
borderColor: 'white',
borderWidth: 2
}, {
type: 'line',
label: 'Hourly Avg',
borderColor: chartColors.green,
backgroundColor: chartColors.green,
borderWidth: 1,
fill: false,
pointRadius: 0,
xAxisID: 'x-axis-2',
data: hourlyAvgData
}]
},
options: {
responsive: true,
title: {
display: true,
text: 'Chart.js - Combo Chart With Multiple Scales (X Axis)'
},
tooltips: {
mode: 'nearest',
intersect: true
},
scales: {
xAxes: [{}, {
id: 'x-axis-2',
type: 'linear',
position: 'bottom',
display: false,
}],
yAxes: [{
ticks: {
min: 0,
max: 50
}
}]
}
}
});
您可以在此 codepen.
看到它的实际效果
这是另一个示例,但不是使用组合图表(每日是条形图,每小时是折线图),两个图都是折线图。方法完全相同,只是图表类型从 bar
更改为 line
。
请注意,在这个版本中,我将每日平均线调整了一个,以便将点绘制在 "end of the day" 处。前面的示例显示的是每天开始时的每日平均值(这在技术上是不正确的)。
这里有一个example codepen演示图表的线版本。
在搜索如何在 Chart.js 中实现移动平均线后登陆这里,我一直在努力完全理解@jordanwillis 的答案,所以也许这对其他人也有用。
中心思想是您可以分配一种数据格式(对于 datasets
中的每个数据集),这样 y
组件代表系列的值,而 x
- 恕我直言,这是关键点 - 匹配要绘制该特定点的标签(在独特的通用 labels
数组中,这将是所有系列的共享 x 轴,即数据集)。 =16=]
因此,我的 N 移动平均线(比如 7 天移动平均线)和 S 在 0 和 N-1(例如 3)之间的一般不对称移动的示例将是
var valuesMean7 = movingAverage(7, 3, ydata, xlabels);
我定义的地方:
function movingAverage(N, shift, values, labels) {
var NN = values.length;
var valuesMean = [];
rightShift = N - shift - 1;
for (let i = shift; i < NN - rightShift; i++) {
var mean = 0;
for (let j = i - shift; j < i - shift + N; j++) {
mean += values[j];
}
mean = mean / N;
valuesMean.push({
x: labels[i],
y: mean
});
}
return valuesMean;
}
我需要显示我认为很常见的用例:折线图显示例如涵盖一周的每日和每小时平均值。
一个数据集显然有7个数据点,另一个有168个。
我找不到允许这样做的示例或记录的选项。当然 - 我几乎可以配置任何关于外观和感觉的东西,但是当涉及到数据大小时,两个数据集都应该具有与标签一样多的数据点。
我只想为数据点较少的数据集添加标签(在这个例子中:每日平均值),而另一个(168 个数据点)只会画一条细线,不应该在图表(无竖线等)[=11=]
Chart.js可以吗?
只要您的数据集中至少有 1 个可以使用备用 scatter chart dataset. Let me walk you through an example where I show the daily avg as bars and the hourly avg as a line (aka, a mixed chart type).
来表达,您所描述的内容实际上可以用 chart.js 实现首先,为一周中的每一天配置一个带有标签的条形图,并提供数据的每日平均值作为您的第一个数据集。
接下来,创建另一个数据集,但将其 type
属性 设置为 'line'
。由于我们想要使用不同的 X 轴和一组不同的标签,因此您必须使用 {x: 0, y: 2}
符号来表达您的数据。这将允许您绕过使用上面定义的标签的比例。
最后,在您的 options.scales
配置中,定义 2 xAxes
比例并将您的第二个数据集关联到第二个 X 轴比例(同时将其 display
属性 设置为false
所以你看不到任何第二个刻度)。
您最终得到的图表配置如下所示。
var ctx = document.getElementById("canvas").getContext("2d");
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
datasets: [{
type: 'bar',
label: 'Daily Avg',
backgroundColor: chartColors.red,
data: dailyAvgData,
borderColor: 'white',
borderWidth: 2
}, {
type: 'line',
label: 'Hourly Avg',
borderColor: chartColors.green,
backgroundColor: chartColors.green,
borderWidth: 1,
fill: false,
pointRadius: 0,
xAxisID: 'x-axis-2',
data: hourlyAvgData
}]
},
options: {
responsive: true,
title: {
display: true,
text: 'Chart.js - Combo Chart With Multiple Scales (X Axis)'
},
tooltips: {
mode: 'nearest',
intersect: true
},
scales: {
xAxes: [{}, {
id: 'x-axis-2',
type: 'linear',
position: 'bottom',
display: false,
}],
yAxes: [{
ticks: {
min: 0,
max: 50
}
}]
}
}
});
您可以在此 codepen.
看到它的实际效果这是另一个示例,但不是使用组合图表(每日是条形图,每小时是折线图),两个图都是折线图。方法完全相同,只是图表类型从 bar
更改为 line
。
请注意,在这个版本中,我将每日平均线调整了一个,以便将点绘制在 "end of the day" 处。前面的示例显示的是每天开始时的每日平均值(这在技术上是不正确的)。
这里有一个example codepen演示图表的线版本。
在搜索如何在 Chart.js 中实现移动平均线后登陆这里,我一直在努力完全理解@jordanwillis 的答案,所以也许这对其他人也有用。
中心思想是您可以分配一种数据格式(对于 datasets
中的每个数据集),这样 y
组件代表系列的值,而 x
- 恕我直言,这是关键点 - 匹配要绘制该特定点的标签(在独特的通用 labels
数组中,这将是所有系列的共享 x 轴,即数据集)。 =16=]
因此,我的 N 移动平均线(比如 7 天移动平均线)和 S 在 0 和 N-1(例如 3)之间的一般不对称移动的示例将是
var valuesMean7 = movingAverage(7, 3, ydata, xlabels);
我定义的地方:
function movingAverage(N, shift, values, labels) {
var NN = values.length;
var valuesMean = [];
rightShift = N - shift - 1;
for (let i = shift; i < NN - rightShift; i++) {
var mean = 0;
for (let j = i - shift; j < i - shift + N; j++) {
mean += values[j];
}
mean = mean / N;
valuesMean.push({
x: labels[i],
y: mean
});
}
return valuesMean;
}