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} />
  </>
);
相关推荐
529宝宝起名网3 小时前
用 Python 开发历史名字查询与起名灵感工具:从古籍人物数据库到名字文化故事生成
开发语言·前端·python
mONESY3 小时前
从 RAG 到 Agentic RAG:固定流程的五个毛病,和把它拆成一张图
javascript
梦帮科技3 小时前
从 Guest 到 Platinum:Prompt 配额、API Key 与访问控制的安全闭环
javascript·git·架构·node.js·reactjs·html5·visual studio
linux_cfan3 小时前
videojs v10 源代码系列解读:10 · `DestroyMixin`:双重 rAF 延迟销毁
前端·javascript·音视频
雪芽蓝域zzs3 小时前
第四十六节:顶部【驾驶舱】独立大屏页面实现
前端·javascript·vue.js
ocean21033 小时前
2025-2026年C++专题大厂面试高频问题
开发语言·c++·面试
白远山4 小时前
健身场馆无人自动化系统实战指南:从架构设计到部署全流程解析
java·开发语言·架构·需求分析
右耳朵猫AI4 小时前
Node.js周刊2026W37 | 三处进程崩溃修复、fs 内置 glob、Workers 模块注册表、Vitest 5.0
javascript·后端·node.js
右耳朵猫AI4 小时前
Web前端周刊2026W37 | Shopify 转原生、React 编译 Rust 化、Vitest 5.0、Rslib 1.0
前端·javascript·react.js·typescript·node.js
郝学胜-神的一滴4 小时前
C++20模板元编程 02:吃透模板基础核心四大核心知识点
开发语言·数据结构·c++·程序人生·软件工程·visual studio