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} />
  </>
);
相关推荐
JYeontu9 小时前
正方体翻滚Loading 2.0
前端·javascript·css
AI人工智能+电脑小能手9 小时前
【大白话说Java面试题 第49题】【JVM篇】第9题:什么是双亲委派机制?介绍一下运作过程。?
java·开发语言·jvm
码农-阿杰9 小时前
Java 线程中断机制深度解析:从 API 到底层 C++ 实现
java·开发语言·c++
Brilliantwxx9 小时前
【C++】priority_queue以及 仿函数 的学习
开发语言·c++·笔记·学习·算法
张元清9 小时前
React 与用户偏好:尊重用户已经在 OS 里设过的那些选项
前端·javascript·面试
RPGMZ9 小时前
RPGMZ 游戏场景全局提示框 带三秒隐藏插件
前端·javascript·游戏·rpgmz
码农学院9 小时前
itextsharp .net中如何设置两个表格的间距设为0,取网站的域名,协议、端口、当前站点目录的地址
开发语言·c#·.net
宠..9 小时前
VS Code 修改 C++ 标准同时修改错误检测标准
java·linux·开发语言·javascript·c++·python·qt
WL_Aurora9 小时前
Java Scanner输入陷阱深度解析
java·开发语言
Han_han9199 小时前
斗地主案例:
java·开发语言