使用 Chart.js 在 React 中进行数据可视化

创建交互式且视觉上有吸引力的图表是开发现代 Web 应用程序的开发人员的一项基本技能。**Chart.js** 是一个流行的数据可视化 JavaScript 库,它提供了一种简单而强大的方法来创建各种类型的图表,例如条形图、折线图、饼图等。当与 React(一种广泛用于构建用户界面的 JavaScript 库)结合使用时,它成为制作动态和响应式可视化的有效工具。在本文中,我们将探讨如何将 Chart.js 集成到 React 项目中并逐步创建令人惊叹的图表。

安装依赖项

  • 使用 vite 安装 react
  • npm create vite@latest

    在终端提示符下输入**项目名称**,然后选择**react**,并根据自己的喜好调整是否使用**javascript**或typescript**。

  • 安装 chart.js 和 react chart js 2
  • npm i chart.js react-chartjs-2

    **react-chartjs-2** 库充当 Chart.js 库的 React 包装器。它通过为各种类型的图表(例如 Line、Bar、Pie)提供预构建的 React 组件,简化了将 Chart.js 集成到 React 应用程序的过程。

    文件夹结构

    Folder Structure

    删除不需要的文件和文件夹并创建一个组件文件夹。

    创建图表组件

    在组件文件夹中,创建一个文件来创建图表。

    Chart Component

    条形图

  • 导入所需的库在此阶段,您可以使用两种方式,惰性方式和可摇树方式。
  • 偷懒的方法

    import 'chart.js/auto';
    import { Chart } from 'react-chartjs-2';

    可摇树的方式

    import { Chart } from 'react-chartjs-2';
    import {
      Chart as ChartJS,
      CategoryScale,
      LinearScale,
      BarElement,
      Title,
      Tooltip,
      Legend,
    } from 'chart.js';
    
    ChartJS.register(
      CategoryScale,
      LinearScale,
      BarElement,
      Title,
      Tooltip,
      Legend
    );

    将 Chart.js 与 React 集成的两种方法(Lazy 方式和 Tree-shakable 方式)都有各自的优点和权衡。

    Lazy 方式使用 import 'chart.js/auto',实现起来快速而简单。它会自动注册所有必要的 Chart.js 组件,是小型项目或快速原型的绝佳选择。但是,这种方法可能会导致包大小变大,因为它会导入并注册所有 Chart.js 组件,甚至包括您可能不会在应用程序中使用的组件。

    Lazy way

    另一方面,Tree-shakable 方式通过允许您仅导入和注册所需的 Chart.js 组件来提供更好的优化。这可以减小包大小,从而提高应用程序性能,尤其是在较大或生产级项目中。但是,它需要更多设置和手动管理已注册的组件,这对于初学者或简单用例来说可能更复杂或繁琐。

    Tree shake

    总而言之,Lazy 方式对于开发的简单性和速度来说是理想的选择,而 Tree-shakable 方式则是性能和捆绑包大小至关重要的生产环境的首选。

    但在本文中,为了简单起见,我们将使用懒惰的方法。

  • 创建图表
  • import 'chart.js/auto';
    import { Chart } from 'react-chartjs-2';
    
    export default function BarChart() {
      const options = {
        responsive: true,
        plugins: {
          title: {
            display: true,
            text: 'Steps taken per day',
          },
        },
      };
    
      const data = {
        labels: [
          'Sunday',
          'Monday',
          'Tuesday',
          'Wednesday',
          'Thursday',
          'Friday',
          'Saturday',
        ],
        datasets: [
          {
            label: 'John',
            data: [10200, 8212, 9435, 10032, 8756, 10324, 9021],
            backgroundColor: '#ef4444',
          },
          {
            label: 'Jane',
            data: [8010, 9432, 9401, 8790, 10431, 9110, 8833],
            backgroundColor: '#3b82f6',
          },
        ],
      };
    
      return (
        
    ); }

    react-chartjs-2 中的 Chart 组件需要三个主要属性:type、data 和 options。

    `type`:指定要呈现的图表类型,例如条形图、折线图、饼图等。这决定了图表的整体外观和结构。

    `data`:包含定义图表显示内容的标签和数据集。例如,在条形图中,数据包括 x 轴上的类别和每个数据集的值。

    `options`:配置图表的其他设置,例如响应性、插件(例如标题和工具提示)和布局调整。此属性允许您自定义图表的行为和外观。

    这三个属性协同工作,在 React 中创建一个功能齐全且可交互的图表。

    Bar Chart

    甜甜圈图

    import 'chart.js/auto';
    import { Chart } from 'react-chartjs-2';
    
    export default function DoughnutChart() {
      const options = {
        responsive: true,
        plugins: {
          title: {
            display: true,
            text: 'Gender of students in a class',
          },
        },
      };
    
      const data = {
        labels: ['Man', 'Woman', 'Other'],
        datasets: [
          {
            label: 'Total',
            data: [45, 50, 5],
            backgroundColor: ['#ef4444', '#3b82f6', '#22c55e'],
          },
        ],
      };
    
      return (
        
    ); }

    折线图

    import 'chart.js/auto';
    import { Chart } from 'react-chartjs-2';
    
    export default function LineChart() {
      const options = {
        responsive: true,
        plugins: {
          title: {
            display: true,
            text: 'Steps taken per day',
          },
        },
      };
    
      const data = {
        labels: [
          'Sunday',
          'Monday',
          'Tuesday',
          'Wednesday',
          'Thursday',
          'Friday',
          'Saturday',
        ],
        datasets: [
          {
            label: 'John',
            data: [10200, 8212, 9435, 10032, 8756, 10324, 9021],
            fill: true,
            backgroundColor: '#ef444450',
            borderColor: '#ef4444',
            tension: 0.5,
          },
          {
            label: 'Jane',
            data: [8010, 9432, 9401, 8790, 10431, 9110, 8833],
            fill: true,
            backgroundColor: '#3b82f650',
            borderColor: '#3b82f6',
            tension: 0.5,
          },
        ],
      };
    
      return (
        
    ); }

    饼图

    import 'chart.js/auto';
    import { Chart } from 'react-chartjs-2';
    
    export default function PieChart() {
      const options = {
        responsive: true,
        plugins: {
          title: {
            display: true,
            text: 'Gender of students in a class',
          },
        },
      };
    
      const data = {
        labels: ['Man', 'Woman', 'Other'],
        datasets: [
          {
            label: 'Total',
            data: [45, 50, 5],
            backgroundColor: ['#ef4444', '#3b82f6', '#22c55e'],
          },
        ],
      };
    
      return (
        
    ); }
    Preview

    重构

    您还可以将数据移动到新文件中并使用映射显示数据。

    //data.ts
    
    export const stepsData = [
      {
        name: 'John',
        steps: [
          {
            day: 'Sunday',
            value: 10200,
          },
          {
            day: 'Monday',
            value: 8212,
          },
          {
            day: 'Tuesday',
            value: 9435,
          },
          {
            day: 'Wednesday',
            value: 10032,
          },
          {
            day: 'Thursday',
            value: 8756,
          },
          {
            day: 'Friday',
            value: 10324,
          },
          {
            day: 'Saturday',
            value: 9021,
          },
        ],
      },
      {
        name: 'Jane',
        steps: [
          {
            day: 'Sunday',
            value: 8010,
          },
          {
            day: 'Monday',
            value: 9432,
          },
          {
            day: 'Tuesday',
            value: 9401,
          },
          {
            day: 'Wednesday',
            value: 8790,
          },
          {
            day: 'Thursday',
            value: 10431,
          },
          {
            day: 'Friday',
            value: 9110,
          },
          {
            day: 'Saturday',
            value: 8833,
          },
        ],
      },
    ];
    import 'chart.js/auto';
    import { Chart } from 'react-chartjs-2';
    import { stepsData } from '../utils/data';
    
    export default function LineChart() {
      const options = {
        responsive: true,
        plugins: {
          title: {
            display: true,
            text: 'Steps taken per day',
          },
        },
      };
    
      const labels = stepsData[0]?.steps.map((step) => step.day);
    
      const datasets = stepsData.map((person) => ({
        label: person.name,
        data: person.steps.map((step) => step.value),
        fill: true,
        tension: 0.5,
      }));
    
      const data = {
        labels,
        datasets,
      };
    
      return (
        
    ); }

    结论

    在本文中,我们探讨了如何将 Chart.js 与 React 集成以创建视觉上引人入胜且具有交互性的图表,包括条形图、圆环图、折线图和饼图。我希望​​本指南能帮助您开始使用 React 进行数据可视化。如需进一步探索并访问完整代码,请随时查看以下链接中的项目存储库。