工作中的一台机器发出状态数据,我想在水平条形图中显示这些数据。
状态可以是ACTIVE
、STOPPED
或INTERRUPTED
。
真实的数据来自:current_array01.MTConnectStreams.Streams.DeviceStream.ComponentStream[8].Events.Execution
,对象包含以下示例数据:
{
"_dataItemId": "exec",
"_timestamp": "2023-10-23T15:16:08.4531+02:00",
"_name": "execution",
"_sequence": "135616878",
"__text": "STOPPED"
}
字符串
其中__text
可以是上面解释的任何一种状态。真实的数据变量将以5秒的间隔被读取。正如@kikon所提到的,对象只有1个时间戳,而图表有2个。第二个时间戳将是原始时间戳+ 5秒,因此图表条目将相互跟进。下面是它应该如何看的例子。
x1c 0d1x的数据
我的虚拟数据图表看起来像这样:
// setup
const data = {
labels: ['Status'],
datasets: [{
label: 'ACTIVE',
data: [
{x: ['2023-01-01 00:00:00', '2023-01-01 01:00:00'], y: 'Status'},
{x: ['2023-01-01 03:00:00', '2023-01-01 06:00:00'], y: 'Status'}
],
backgroundColor: 'rgba(88,188,116,1)'
},{
label: 'STOPPED',
data: [
{x: ['2023-01-01 02:00:00', '2023-01-01 03:00:00'], y: 'Status'}
],
backgroundColor: 'rgba(255,172,100,1)'
},{
label: 'INTERRUPTED',
data: [
{x: ['2023-01-01 01:00:00', '2023-01-01 02:00:00'], y: 'Status'},
{x: ['2023-01-01 06:00:00', '2023-01-01 07:00:00'], y: 'Status'}
],
backgroundColor: 'rgba(195,40,96,1)'
}]
};
// config
const config = {
type: 'bar',
data,
options: {
responsive: true,
maintainAspectRatio: false,
indexAxis: 'y',
scales: {
x: {
type: 'time',
time: {
unit: 'hour'
},
min: '2023-01-01'
},
y: {
beginAtZero: true,
stacked: true,
ticks: {
display: false,
}
}
},
plugins: {
tooltip: {
enabled: false,
}
},
layout: {
padding: {
top: 10,
right: 20,
bottom: 10,
left: 20
}
},
}
};
// render init block
const statusChart = new Chart(
document.getElementById('statusChart01'),
config
);
型
如何编辑代码,使其每秒获取真实的数据,并将其添加到图表中,最多添加100个条目,以便最旧的条目从图表中消失?
1条答案
按热度按时间xghobddn1#
更新图表的一种简单而标准的方法是,只需更改配置对象中
data.datasets
对象的内容,然后调用chart.update()
方法,其中chart
是图表对象,是调用Chart
构造函数的结果。例如,在更新函数中,x轴可以作为
chart.options.scales.x
访问;它的属性也可以直接通过config.options.scales.x
更改,其中config
是配置对象,在唯一调用Chart
构造函数(const chart = new Chart(config)
)时使用的参数。从您的设置描述中得到的数据结构是queue,JavaScript
Array
通过其方法.push()
(enqueue)和.shift()
(dequeue)完成此操作,没有问题。然而,实际上有三个不同的数据集,每个颜色(状态)一个,并且知道在出队时从哪一个删除最左边的数据点需要一些编码,这些编码可能无法从文本描述中受益,因此最好将其留在下面的清单中。模拟你描述的流设置很有趣,这是一个变量访问器(
current_array01.MTConnectStreams.Streams.DeviceStream.ComponentStream[8].Events.Execution
),每当评估时可能会返回一个不同的值(我设置为每5秒后随机更改(或不更改))。它在没有明显调用函数的情况下更改其值的事实是通过get
语法完成的。下面是代码的一个版本,在代码片段中:
个字符