我正在开发一个小型仪表板ASP.NET
,在 的帮助下,使用Chart.jsC#
生成堆叠的水平条形图时遇到问题。
我有一些技术人员的数据,他们被分配了一定数量的票,根据图像对应于Y
图表的轴。A
, B
,C
和D
代表每个技术人员,从 1 到 4 的数据集代表每个工单的状态。我想在图表中获得的是每个技术人员考虑到他们的状态的票数。我附上了我想要做的示例图片:
错误:
我正在制作如上一个示例中所示的预期水平条形图,但我无法正确查看数据集及其颜色。
到目前为止,我所取得的成就是查看技术人员每个人拥有的票数,但是在图表底部表示状态的数据集ASIGNADO
是重复的,此外还有其他状态和每个数据集,即每个状态,它必须用一种颜色表示:
更准确地说,我在这里添加了在文档中找到的示例Stacked bar
Chart.js
表格中的数据结构如下,我从中提取要显示的信息,TK_HD_TICKETS_ID
注册的票在哪里,我想从哪里获取数量,TK_CT_STATUS_ID
票的状态存储在哪里,在TK_BT_EMPLOYEES_ID
你有那个票的技术员是谁
以下是Javascript
我要在图中加载数据的函数:
function loadEmployeesChart() {
document.getElementById("chart-employee").remove();
let auxCanvasEmployee = document.createElement('canvas');
auxCanvasEmployee.setAttribute('id', 'chart-employee');
auxCanvasEmployee.setAttribute('style', 'width: 720px; height: 600px');
document
.querySelector('#chartEmployeeContainer')
.appendChild(auxCanvasEmployee);
var canvas = document.getElementById("chart-employee");
var ctx = canvas.getContext("2d");
var dataEmployee;
var myNewChart;
$.ajax({
url: document.getElementById("employeeChart").value,
type: "POST",
dataType: "json",
data: {
refreshType: document.getElementById("dataOption").value
},
success: function (data) {
var dataChart = [];
var label = [];
var datalabels = [];
var stacks = []
for (let idx in data.DashboardTicketList) {
if (data.DashboardTicketList.hasOwnProperty(idx)) {
dataChart.push(data.DashboardTicketList[idx].TicketsCount);
label.push(data.DashboardTicketList[idx].TicketsAsignedTo);
datalabels.push(data.DashboardTicketList[idx].TicketsClasificationType);
}
}
var count = false;
for (let idx in dataChart) {
if (dataChart[idx] > 0) {
count = true;
break;
}
}
if (count) {
document.getElementById('noDataEmployee').style.display = 'none';
} else {
document.getElementById('noDataEmployee').style.display = 'block';
}
dataEmployee = {
labels: label,
datasets: [{
label: datalabels,
data: dataChart,
}],
};
myNewChart = new Chart(ctx, {
type: 'horizontalBar',
data: dataEmployee,
options: {
maintainAspectRatio: false,
scales: {
xAxes: [{
stacked: true // this should be set to make the bars stacked
}],
yAxes: [{
stacked: true // this also..
}]
},
legend: {
position: 'bottom',
padding: 5,
labels:
{
pointStyle: 'circle',
usePointStyle: true
}
}
},
});
},
error: function () { }
});
}
您遇到的问题在于您对从查询中获得的数据进行转换以及在执行相同的操作中。您实际上是在创建与从查询中获得的结果一样多
labels
的datasets
结果,您应该通过对结果进行分组来做到这一点,否则您将拥有大量重复数据。最好的一点是你的数据已经从服务器分组了,但是以此时到达的数据为源,我将尝试逐步描述一个可能的解决方案(尽管有很多可能的解决方案)。假设查询返回了许多
x
行,我们以下面的例子为例:首先,
labels
必须创建图需要的那些(这些必须是唯一的,不能有重复的元素):这应该返回以下数组:
然后您需要过滤数据以对它们进行分组,为此您可以生成一个由类型属性组成的对象
TicketsClasificationType
,作为所述属性的值,一个由类型属性TicketsAsignedTo
和值组成的对象TicketsCount
:这将返回如下对象:
通过已经对查询数据进行分组,
datasets
可以生成您需要的数组:这是一个示例片段,因此您可以看到代码工作:
在这个小提琴中,有一个改编自这个SO question的示例,您可以将其用作基础。
如果你看一下
datasets
,同一组的每个元素都会重复data
。不同之处在于它改变了stack
,这将是子组。如果您放置原始数据,则可以更详细地说明如何准备datasets
.