Chart.js - 每条的水平线

dan*_* gi 4 chart.js

我正在尝试使用 Chart.js 2.9.2 绘制一个每条带有水平线和 2 个数据集(实际、目标)的图表,如下所示:

在此输入图像描述

但没有成功...这可能吗?

umi*_*der 5

您可以将目标值转换为浮动条,其中使用语法指定各个条[min, max]。给定一个名为 的值数组targetData,可以按如下方式对其进行转换Array.map()

targetData.map(v => [v - 1, v + 1])
Run Code Online (Sandbox Code Playgroud)

此外,您需要xAxis为两个数据集定义单独的堆叠。为了在工具提示中显示原始目标值,toolips.callback.label还需要一个函数。

请查看下面的可运行代码片段。

targetData.map(v => [v - 1, v + 1])
Run Code Online (Sandbox Code Playgroud)
const actualData = [100, 180, 120, 80, 140, 170, 160];
const targetData = [110, 150, 140, 100, 120, 110, 170];

new Chart("chart", {
  type: "bar",
  data: {
    labels: ["KPI 1", "KPI 2", "KPI 3", "KPI 4", "KPI 5", "KPI 6", "KPI 7"],
    datasets: [{
        label: "Actual",
        backgroundColor: 'rgba(0, 0, 255, 0.2)',
        data: actualData,
        xAxisID: "x-axis-actual"
      },
      {
        label: "Target",
        backgroundColor: 'rgba(255, 0, 128, 1)',
        data: targetData.map(v => [v - 1, v + 1]),
        xAxisID: "x-axis-target"
      }
    ]
  },
  options: {
    tooltips: {
      callbacks: {
        label: (tooltipItem, data) => {
          const v = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
          return Array.isArray(v) ? (v[1] + v[0]) / 2 : v;
        }
      }
    },
    scales: {
      xAxes: [{
          id: "x-axis-target",
          stacked: true
        },
        {
          display: false,
          offset: true,
          stacked: true,
          id: "x-axis-actual",
          gridLines: {
            offsetGridLines: true
          }
        }
      ],
      yAxes: [{
        ticks: {
          beginAtZero: true
        }
      }]
    }
  }
});
Run Code Online (Sandbox Code Playgroud)