Loading
0

JavaScript图表控件AG Charts使用教程:使用AG Charts React实时更新柱状图

本教程旨在展示如何实时(每隔一段时间10ms)以及根据用户交互更新 AG 图表。完成本教程后,将得到如下所示的图表:

AG Charts最新版下载

项目设置

首先,需要配置项目。先使用 Vite 创建一个新的 React 应用,然后安装必要的依赖项:

npm create vite@latest ag-charts-realtime-updates-demo -- --template react
cd ag-charts-realtime-updates-demo 
npm install

然后就可以安装 AG Charts React 库了:

npm install ag-charts-react

生成数据

在创建图表之前,需要一些数据来展示。请查看下面的数据集,其中包含一个产品数组及其对应的价格数据。数组中的每个对象代表 x 轴上的一个类别(产品),每个属性(上一价、当前价、pl1、pl2)将以柱状图的形式绘制在 y 轴上:

[
  {
    "product": "Cobalt",
    "previous": 10817.55,
    "current": 27893.21,
    "pl1": 23667.47,
    "pl2": 16694.04
  },
  {
    "product": "Rubber",
    ...
  }
  ...
]

接下来,为了实时更新图表中显示的数据,需要一种动态生成数据的方法。为了简化操作,已经预先构建了这部分逻辑。只需下载DataGenerator.js下面的文件并将其添加到项目中即可:

当然,可以查看源代码,但这里需要记住的是,可以调用该函数createNewDataSet()来创建一个包含每个产品更新价格数据的新数据集。

创建图表

现在已经完成了项目设置,并且有了动态生成数据的方法,可以开始实现图表了。

首先要做的是创建一个新PriceChart.jsx组件并导入AgChartsReact,以及createNewDataSet实用方法。

import React, { useState } from "react";
import { AgChartsReact } from "ag-charts-react";
import createNewDataSet from "./DataGenerator";

export default function PriceChart() { }

接下来,创建一个chartOptions变量(用于配置和更新图表),并通过属性<AgChartsReact />传递对象来返回组件:chartOptionsoptions

export default function PriceChart() {
  const [chartOptions, setChartOptions] = useState({});
  return (<AgChartsReact options={chartOptions} />)
}

然后,可以将这个新组件渲染到根元素中index.js:

import React from "react";
import ReactDOM from "react-dom/client";
import PriceChart from "./PriceChart";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<PriceChart />);

配置图表

现在已经有了图表的基本框架,接下来需要根据应用程序的需求进行配置。请将以下属性添加到chartOptions对象中:

const [chartOptions, setChartOptions] = useState({
  title: { text: "Price Data" },
  subtitle: { text: "December 1st, 2023" },
  theme: "ag-vivid-dark",
  height: 750,
  data: createNewDataSet()
  series: ["previous", "current", "pl1", "pl2"].map(
    (yKey) => ({
      type: "bar",
      xKey: "product",
      yKey: yKey
    })
  ),
}

逐一分析这些属性,并解释它们的作用:

  • title,subtitle:显示在图表顶部的文本。
  • theme:图表预设样式。已选择了一种样式ag-vivid-dark,但也可以从主题列表中选择其他样式。
  • height默认情况下,图表会自动调整大小以填充其容器元素。通过指定高度height: 750,可以强制图表保持固定的高度,而不管其容器大小如何。由于没有指定宽度,因此图表将填充其容器元素(在本例中为 100%)。
  • data:要在图表中可视化的数据集,由该方法动态生成createNewDataSet。
  • series:通过循环遍历价格指标创建一系列序列,每个产品生成 4 个柱状图——每个价格指标对应一个柱状图。

此时运行图表应该会显示一个条形图,y 轴上绘制 6 个数据点,x 轴上对应每种产品:

更新图表

现在已经完成了图表的配置,可以开始实时触发数据更新了。

更新图表非常简单——只需要克隆、修改和更新chartOptions对象,图表就会自动处理任何更改:

// Update Chart Data
const updateStockPrices = () => {
  setChartOptions((currentOptions) => ({
    ...currentOptions,
    data: createNewDataSet(),
  }));
};

然后可以使用它setInterval来调用updateStockPrices()每个函数10ms。将在一个带有空依赖数组的钩子函数中执行此操作useEffect,以便在图表渲染时触发此操作:

useEffect(() => {
  let interval = setInterval(() => {
    updateStockPrices();
  }, 10);
  return () => clearInterval(interval);
}, []);

就这样,你现在应该有一个每隔一段时间更新一次的图表了10ms:

处理用户交互

本教程的最后一部分将介绍如何根据用户交互更新图表。为了演示这一点,我们将添加两个按钮,分别用于切换图表的水平/垂直方向以及堆叠/分组柱状图模式。

我们将首先实现用于在堆叠柱状图/分组柱状图之间切换的按钮。

我们只需要实现一个函数,该函数更新我们的chartOptions对象,使其包含该stacked属性并为其赋值:

const toggleStacked = () => {
  setChartOptions((currentOptions) => ({
    ...currentOptions,
    series: currentOptions.series.map((seriesItem) => ({
      ...seriesItem,
      stacked: !seriesItem.stacked,
    })),
  }));
};

然后,在我们的组件中添加一个按钮,该按钮调用此函数:

return (
  <>
    {/* Chart Controls */}
    <div>
      <button onClick={toggleStacked}>
        {chartOptions.series[0].stacked ? "Group" : "Stack"}
      </button>
    </div>
    {/* Chart component */}
    <AgChartsReact options={chartOptions} />
  </>
);

旋转图表的逻辑完全相同:创建一个函数来切换属性值direction,并添加一个按钮来调用此函数:

// Rotate Chart
const rotateDirection = () => {
  setChartOptions((currentOptions) => ({
    ...currentOptions,
    series: currentOptions.series.map((seriesItem) => ({
      ...seriesItem,
      direction:
        seriesItem.direction === "horizontal" ? "vertical" : "horizontal",
    })),
  }));
};

return (
  <>
    {/* Chart Controls */}
    <div>
      <button onClick={rotateDirection}>{"Rotate"}</button>
      <button onClick={toggleStacked}>
        {chartOptions.series[0].stacked ? "Group" : "Stack"}
      </button>
    </div>
    {/* Chart component */}
    <AgChartsReact options={chartOptions} />
  </>
);

------------------------------------------------------------

关于慧都科技

慧都科技是一家行业数字化解决方案公司,长期专注于软件、油气与制造行业。公司基于深入的业务理解与管理洞察,以系统化的业务建模驱动技术落地,帮助企业实现智能化运营与长期竞争优势。在软件工程领域,我们提供开发控件、研发管理、代码开发、部署运维等软件开发全链路所需的产品,提供正版授权采购、技术选型、个性化维保等服务,帮助客户实现技术合规、降本增效与风险可控。慧都科技是AG Grid的在中国区的合作伙伴,AG Grid / AG Charts作为JavaScrip表格/图表领域的优秀产品,帮助企业实现轻松构建高性能的表格及图表。

获取产品优惠或试用AG Grid产品联系在线客服咨询,或拨打产品热线:023-68661681