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} />
  </>
);
相关推荐
我命由我123452 小时前
React - 类组件 setState 的 2 种写法、LazyLoad、useState
前端·javascript·react.js·html·ecmascript·html5·js
ywf12153 小时前
Go基础之环境搭建
开发语言·后端·golang
是有头发的程序猿3 小时前
用Open Claw接口做1688选品、价格监控、货源对比
开发语言·c++·人工智能
斯班奇的好朋友阿法法4 小时前
离线ollama导入Qwen3.5-9B.Q8_0.gguf模型
开发语言·前端·javascript
计算机安禾4 小时前
【数据结构与算法】第19篇:树与二叉树的基础概念
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio
Zarek枫煜4 小时前
[特殊字符] C3语言:传承C之高效,突破C之局限
c语言·开发语言·c++·单片机·嵌入式硬件·物联网·算法
莫物4 小时前
vue过滤表格数据导致的索引错乱问题
前端·javascript·vue.js
竹林8184 小时前
从监听失败到实时更新:我在NFT铸造项目中搞定合约事件监听的全过程
前端·javascript
光影少年4 小时前
手写防抖和节流
前端·javascript·前端框架