如何使用反应图表 js 2 为每个条设置 X 坐标?

How to set X coordinate for each bar with react chart js 2?

我想制作一个图表,其中包含最小和最大垂直线以及它们之间的条形图。我找不到有关如何设置条形的 X 坐标或使用垂直 'bars' 而不是点制作自定义线图的信息。 而且我不明白如何缩放 X 轴,为什么 MAX 是左侧 MIN?最小值=22.5,最大值=24.5

let plot_options = {
    showScale: true,
    pointDot: true,
    showLines: true,
    maintainAspectRatio: false,
    annotation: {
        annotations: [
            {
                type: 'line',
                mode: 'vertical',
                scaleID: 'y-axis-0',
                value: min,
                borderColor: 'red',
                borderWidth: 2,
                label: {
                    backgroundColor: 'red',
                    content: 'Min',
                    enabled: true,
                },
            },
            {
                type: 'line',
                mode: 'vertical',
                scaleID: 'y-axis-0',
                value: max,
                borderColor: 'red',
                borderWidth: 2,
                label: {
                    backgroundColor: 'red',
                    content: 'MAX',
                    enabled: true,
                },
            },
        ]
    },
    title: {
        display: true,
        text: plotHeader,
    },
    responsive: true,
    legend: {
        display: false,
    },
    scales: {
        xAxes: [{
            scaleLabel: {
                display: true,
                labelString: labelx
            },
            ticks: {
                min: min,
                max: max
            }
        }],
        yAxes: [{
            scaleLabel: {
                display: true,
                labelString: labely
            },
            ticks: {
                beginAtZero: true,
            },
        }]
    },
}

data = {
        barPercentage: 0.5,
        barThickness: 6,
        maxBarThickness: 8,
        minBarLength: 2,
        labels: labels,
        datasets: [{
                    data: values,
                    borderColor: BLUE,
                    backgroundColor: BLUE
                }]
      }
<Bar options={plot_options}  data={data} plugins={ChartAnnotation}  />

这就是我的期望:

此解决方案基于此 answer 用于在线性 x 轴上定位条。

您可以进一步使用 Plugin Core API to draw the vertical min and max lines with their labels directly on the canvas. The API offers a number of hooks that can be used to perform custom code. In your case, you could use the afterDraw hook together with CanvasRenderingContext2D

请查看下面的可运行代码,看看它是如何工作的。使类似的代码与 react-chartjs-2.

一起工作应该不会太难

new Chart("chart", {
  type: 'bar',
  plugins: [{
    afterDraw: chart => {
      let ctx = chart.chart.ctx;
      ctx.save();
      let xAxis = chart.scales['x-axis-0'];      
      let yAxis = chart.scales['y-axis-0'];      
      let dataset = chart.data.datasets[0];
      [dataset.min, dataset.max].forEach((v, i) => {      
        var x = xAxis.getPixelForValue(+v * 1000);
        ctx.fillStyle = 'red';
        ctx.font = '14px Arial';
        ctx.textAlign = 'center';        
        ctx.fillText(i == 0 ? 'Min' : 'Max', x, yAxis.top + 14);
        ctx.fillStyle = 'gray';
        ctx.font = '12px Arial';
        ctx.fillText(v, x, yAxis.bottom + 20);
        ctx.beginPath();
        ctx.moveTo(x, yAxis.top + 20);
        ctx.strokeStyle = 'red';
        ctx.lineTo(x, yAxis.bottom + 3);
        ctx.stroke();
      });
      ctx.restore();
    }
  }],  
  data: {
    datasets: [{
      min: 22.5,
      max: 24.5,
      data: [
        { x: '22.83', y: 18 },
        { x: '23.17', y: 15 },
        { x: '23.44', y: 13 },
        { x: '24.32', y: 20 }
      ],
      borderColor: 'blue',
      backgroundColor: 'blue',
      barThickness: 20
    }]
  },
  options: {
    legend: {
      display: false,
    },
    scales: {
      xAxes: [{
        offset: true,
        type: 'time',
        time: {
          parser: 'X',
          unit: 'millisecond',
          displayFormats: {
            millisecond: 'X'
          }
        },
        ticks: {
          source: 'data',
          min: '22.5',
          callback: (v, i, values) => values[i].value / 1000
        },
        gridLines: {
          display: false
        },
      }],
      yAxes: [{
        ticks: {
          beginAtZero: true,
          max: 22,
          stepSize: 2
        }
      }]
    }
  }
});
canvas {
  max-width: 500px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.bundle.min.js"></script>
<canvas id="chart" height="200"></canvas>