我正在尝试创建一个x轴上有一个小时时段的堆叠条形图(上午9点,上午10点,上午11点,...)和计数的y轴。我想按天分组的数据(星期一,星期二,...)和人(Alice,Bob)看起来像这样:x1c 0d1x星期一,星期二,鲍勃,爱丽丝应该是可选选项(隐藏/显示),但没有标签的酒吧-(这只是为了澄清数据)。
理想情况下,我想指定我的数据如下:
const labels = ['9am','10am','11am','12pm'];
const data = {
labels: labels,
datasets: [
{
label: 'Monday',
data: [{x:'9am',person:'Bob',y:7},{x:'10am',person:'Bob',y:6},{x:'11am',person:'Bob',y:5},{x:'12pm',y:4},{x:'9am',person:'Alice',y:7},{x:'10am',person:'Alice',y:6},{x:'11am',person:'Alice',y:5},{x:'12pm',y:4}],
stack: data.x,
},
{
label: 'Tuesday',
data: [{x:'9am',person:'Bob',y:7},{x:'10am',person:'Bob',y:6},{x:'11am',person:'Bob',y:5},{x:'12pm',y:4},{x:'9am',person:'Alice',y:7},{x:'10am',person:'Alice',y:6},{x:'11am',person:'Alice',y:5},{x:'12pm',y:4}],
}
]
};
字符串
或(编辑1)
const labels = ['9am','10am','11am','12pm'];
const data = {
labels: labels,
datasets: [
{
label: 'Bob',
data: [{x:'9am',day:'Monday',y:7},{x:'10am',day:'Monday',y:6},{x:'11am',day:'Monday',y:5},{x:'12pm', day:'Monday', y:4},{x:'9am',day:'Tuesday',y:7},{x:'10am',day:'Tuesday',y:6},{x:'11am',day:'Tuesday',y:5},{x:'12pm',day:'Tuesday',y:4}],
backgroundColor: 'blue'
},
{
label: 'Alice',
data: [{x:'9am',day:'Monday',y:7},{x:'10am',day:'Monday',y:6},{x:'11am',day:'Monday',y:5},{x:'12pm',day:'Monday',y:4},{x:'9am',day:'Tuesday',y:7},{x:'10am',day:'Tuesday',y:6},{x:'11am',day:'Tuesday',y:5},{x:'12pm',day:'Tuesday',y:4}],
backgroundColor:'amber';
}
]
};
型
并由一些数据项指定堆栈,如'data.day'。
我试过的配置:
const config = {
type: 'bar',
data: data,
options: {
plugins: {
title: {
display: true,
text: 'Chart.js Bar Chart - Stacked'
},
},
responsive: true,
scales: {
x: {
stacked: true,
},
y: {
stacked: true
}
}
}
};
型
const labels = ['9am','10am','11am','12pm'];
const data = {
labels: labels,
datasets: [
{
label: 'Bob-Monday',
data: [{x:'9am',y:7},{x:'10am',y:6},{x:'11am',y:5},{x:'12pm',y:4}],
stack: 'Monday',
},
{
label: 'Alice-Monday',
data: [{x:'9am',y:7},{x:'10am',y:8},{x:'11am',y:10},{x:'12pm',y:9}],
stack: 'Monday',
},
{
label: 'Bob-Tue',
data: [{x:'9am',y:7},{x:'10am',y:6},{x:'11am',y:4},{x:'12pm',y:3}],
stack: 'Tue',
},
{
label: 'Alice-Tue',
data: [{x:'9am',y:7},{x:'10am',y:8},{x:'11am',y:10},{x:'12pm',y:9}],
stack: 'Tue',
}
]
};
const config = {
type: 'bar',
data: data,
options: {
plugins: {
title: {
display: true,
text: 'Chart.js Bar Chart - Stacked'
},
},
responsive: true,
scales: {
x: {
stacked: true,
},
y: {
stacked: true
}
}
}
};
const ctx = document.getElementById('myChart');
const chart = new Chart(ctx, config);
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<canvas id="myChart"></canvas>
的字符串
1条答案
按热度按时间g52tjvyc1#
由于问题的主要特征似乎是数据由两个变量
person
和day
索引的事实,(除了标准的x轴变体hour
之外),由于您已经建议以非chart.js格式重新构建数据,但对数据有意义,我建议您的数据结构上的两个层次的格式(以下示例中的dataset2d
)并使用一个custom plugin,它将在其beforeInit
处理程序中预处理数据。这将允许在datasets2d
项的级别设置选项,注意:形式上,数据是三维的,但由于hour
是x轴上表示的变量,因此我们将关注其余两个变量。这个问题的主要难点在于对自定义图例项的要求。幸运的是,chart.js在图例标签配置方面非常灵活,允许以
pointStyle
的形式提供自定义图例或画布,而选择和取消选择图例项的效果可以通过可自定义的图例单击处理程序来完美控制。下面的代码片段中的插件
datasets2d
首先将2d数据简单Map到一维标准数据集,并将堆栈对应于内部label
的值。然后,它使用上面提到的图例自定义功能来实现所需的图例项形式和功能。个字符
Here's a version与多个人和天;添加或删除一天或一个人就像更改前两个数组的内容一样简单。