javascript - 如何将变量传递给chart.js中图表的数据集?
问题描述
我试图在 chart.js 中创建一个图表,部分使用代码中给出的静态数据值,但也部分使用用户给出的数据值。变量的值可能会发生变化,因为它是来自用户的不同解析输入的总和,我希望图表能够根据总和的变化实时更新。
我了解以下代码会返回错误,因为classaverage
未定义变量,并且还了解可以重复调用类名并在Chart()
函数下重新进行计算。但是,由于实际表实际上比示例中的表大得多,我宁愿使用更短的方法,而不必占用所有空间。这可能吗?
我的代码:
document.getElementById("jack").contentEditable = true;
document.getElementById("john").contentEditable = true;
document.getElementById("joe").contentEditable = true;
function myFunction() {
var jack2 = document.getElementById("jack").innerText;
var john2 = document.getElementById("john").innerText;
var joe2 = document.getElementById("joe").innerText;
var total2 = (parseInt(jack2) || 0) + (parseInt(john2) || 0) + (parseInt(joe2) || 0);
document.getElementById("total").innerHTML = total2;
}
var ctx = document.getElementById('totalchart').getContext('2d');
var chart = new Chart(ctx, {
type: 'bar',
data: {
labels: ['Class', 'City', 'District'],
datasets: [{
label: 'Average Weight',
backgroundColor: 'rgb(255, 99, 132)',
borderColor: 'rgb(255, 99, 132)',
data: [classaverage, 130, 135]
}]
},
options: {
scales: {
yAxes: [{
display: true,
ticks: {
beginAtZero: true,
min: 0,
max: 200,
}
}]
}
}
});
table,
tr,
th,
td {
border: 1px solid black;
border-collapse: collapse;
font-style: Arial;
}
<table>
<tr class="cell">
<th>Person</th>
<th>Weight</th>
</tr>
<tr class="cell">
<td>Jack</td>
<td id="jack" oninput="myFunction()">120</td>
</tr>
<tr class="cell">
<td>John</td>
<td id="john" oninput="myFunction()">140</td>
</tr>
<tr class="cell">
<td>Joe</td>
<td id="joe" oninput="myFunction()">150</td>
</tr>
<tr class="cell">
<td>Total</td>
<td id="total"></td>
</tr>
</table>
<canvas id="totalchart"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0"></script>
解决方案
如果您更新答案,我不确定您要通过计算实现什么我将能够向您展示一个工作示例,但要实时更新图表,您需要 addData():
function addData(chart, label, data) {
chart.data.labels.push(label);
chart.data.datasets.forEach((dataset) => {
dataset.data.push(data);
});
chart.update();
}
可能还有removeData():
function removeData(chart) {
chart.data.labels.pop();
chart.data.datasets.forEach((dataset) => {
dataset.data.pop();
});
chart.update();
}
除非你替换数据():
function replaceData(chart, data) {
chart.data.labels = Object.keys(data);
chart.data.datasets.forEach((dataset) => {
dataset.data = Object.values(data);
});
chart.update();
}
我创建了一个示例小提琴显示 addData 的实现
请参考文档
推荐阅读
- go - 如何使用 go/analysis 忽略测试文件(_test.go)?
- python - ValueError:conv2d 层的输入 0 与层不兼容::预期 min_ndim=4,发现 ndim=3。收到的完整形状:(无、180、180)
- c# - 使用 linq 和 c# 的最大父 ID 的子节点数
- powershell - 使用带有 foreach 循环的 where 条件的 Powershell 语法
- c# - 无法在 CollectionView 中选择一个项目两次,当尝试解决时,在 Xamarin Forms 中触发事件两次
- azure - 具有多个侦听器的 Azure 事件中心
- azure-table-storage - 无模式但为什么存储资源管理器会显示已删除实体的属性?
- javascript - 如何将 JSON 文件中的值转换为 const?
- python - 默认情况下 pd.concat 是否保持列表中 DataFrame 的顺序
- java - Hibernate将json映射到dto?