如何在坐标轴和工具提示中格式化Chart.js日期

pw9qyyiw  于 2023-06-05  发布在  Chart.js
关注(0)|答案(1)|浏览(205)

我有下面的代码,使用chart.js来生成一个线图。Y轴表示价格值,而X轴表示日期值。我希望X轴上的日期只显示年份,但我仍然希望将鼠标悬停在数据点上时,工具提示中显示完整的日期。

const datesArray = ["1 May 2023", "2 May 2023", "3 May 2023", "4 May 2023", "5 May 2023"];
  const valuesArray = [107.71, 105.98, 106.12, 105.21, 106.215];

  const Chart = ({ width }) =>  (
    <ChartDiv style={{ width }} className='cursor-auto'>
      <PriceGraph 
         chartData={{ data: valuesArray, labels: datesArray }} 
         chartColour={'#218B82'} 
         chartFillColour={'#F2FFFF'} 
      />
    </ChartDiv>
  );
import React from 'react';
import { Line } from 'react-chartjs-2';
import { Chart, registerables } from 'chart.js';
import 'chartjs-adapter-date-fns';
Chart.register(...registerables);

const PriceGraph = ({ chartData, chartColour, chartFillColour }) => {
  const options = {
    scales: {
      x: {
        ticks: {
          display: true,
          callback: (value, index, values) => {
            const tickDate = new Date(value);
            return tickDate.getFullYear().toString();
          }
        }
      },
      y: {
        beginAtZero: true,
        ticks: {
          display: true,
        }
      }
    }
  }

  const data = {
    labels: chartData.labels,
    datasets: [
      {
        data: chartData.data,
        backgroundColor: chartFillColour,
        borderColor: chartColour,
        fill: true,
      }
    ]
  }

  return <Line data={chartData.labels ? data : null} options={options}/>;  
}

export default PriceGraph

当我运行我的代码时,工具提示反映了正确的日期,但是X轴上的每个刻度都显示“1970”。我希望这是一个问题,数据被输入到我的回调函数或不适当的使用回调函数。
回顾chart.js文档,有一个指示,我应该使用类型:时间,并应用格式。当我按如下所示修改代码时,我得到一个空白图表。

scales: {
      x: {
        type: 'time',
        time: {
          unit: 'year',
          tooltipFormat: 'dd MMM yyyy'
        },
        ticks: {
          display: true,
        }
      },

有什么建议我应该如何去格式化我的X轴?

4uqofj5v

4uqofj5v1#

由于某些原因,回调函数中的参数没有按预期填充。理想情况下,第一个参数值应该是将要打印的值。
解决方法是使用现有数据和回调参数中的索引。你可以试试下面的代码。

callback: function(value, index, ticks) {
  const tickDate = new Date(chartData.labels[index]);
  return tickDate.getFullYear().toString();
}

相关问题