zoukankan      html  css  js  c++  java
  • Chart.js 学习笔记

    前言

    Chart.js 是前端用来做可视化数据的库. 它是用 canvas 来实现的. 里头有各式各样的图表.

    这个比较难系统学习, 通常都是项目需要用到才去翻翻找找. 但是日子久了难免又忘东忘西. 所以最好还是写一个小笔记.

    这篇会记入我有用过的图片和配置.

    参考

    官网 docs

    Github

    Installation

    从 version 3.0 以后, Chart.js 有自带的 Typescript 了, 

    yarn add chart.js

    常见的 import 方式

    import { Chart, BarElement, BarController, CategoryScale, LinearScale, Tooltip } from 'chart.js';
    Chart.register(BarElement, BarController, CategoryScale, LinearScale, Tooltip);

    3.0 以后比较模块化了, 有用到的才 import + register

    完整的模块可以参考这里

    测试期间可以通过下面这个方式把全部一次加入

    import { Chart, registerables } from 'chart.js';
    Chart.register(...registerables);

    跑起来

    一个最简单的图表, X 轴是动物, Y 轴式数字 

    先不要管中间的 undefined. 

    第一步是去 html 添加一个 canvas 和一个 div wrapper 用来控制图表的大小.

    它默认是 responsive 的哦, 详解看这里

    <div style=" 800px">
        <canvas id="chart"></canvas>
    </div>

    当设置 800px 宽以后, 高度默认会是 400px, 因为它默认是有一个aspect ratio 2 的 

    然后是 ts

    import { Chart, registerables } from 'chart.js';
    Chart.register(...registerables);
    const canvas = document.querySelector<HTMLCanvasElement>('#chart')!;
    new Chart(canvas, {
      type: 'bar', // 图表类型
      data: {
        labels: ['Dog', 'Cat', 'Fish'], // X 轴
        datasets: [
          {
            backgroundColor: 'green',
            data: [5, 10, 15], // Y 轴
          },
        ],
      },
    });

    Datasets, Legend, Label

    上面那个 undefined 中间位置其实叫 legend, 刚才的是一个最简单的 bar 图表

    比较常见的 bar 图表一般上会超过 1 个 Dataset

    每一个动物都有 3 个不同属性的数据. 中上位置的 legend 就表示了这些属性, 它还有 filter 的功能 toggle click 图表就会移除该属性.

    它的配置是这样的

    new Chart(canvas, {
      type: 'bar',
      data: {
        labels: ['Dog', 'Cat', 'Fish'],
        datasets: [
          {
            label: 'Label 1',
            backgroundColor: 'green',
            data: [5, 10, 15],
          },
          {
            label: 'Label 2',
            backgroundColor: 'red',
            data: [15, 20, 25],
          },
          {
            label: 'Label 3',
            backgroundColor: 'blue',
            data: [2, 4, 6],
          },
        ],
      },
    });

    多了 2 个 datasets, 并且每一个 dataset 都有一个 label 表示 legend

    留意它的结构, 1 个 dataset 表示一个 legend, 里头有所有动物的对应那个 legend 的数据. 它的结构是这样子的哦.

    legend 可以通过 options 去给一些 design 的配置, 比如调 width 等等

    更多配置看这里

    Dataset/Legend 重叠

    有时候我们会想把数据往上叠加起来看

    通过 scales 配置可以到达效果

    Horizon bar

    version 3.0 以前有一个 chart type : horizontalBar, 3.0 以后就没有了

    改成了 

    效果:

    Prefix/Subfix e.g. Percent

    有时候 data 数据是 % 或者 $ 那么我们可以通过配置去修改 Y 轴的显示值

    配置

    Tooltip

    tooltip 就是当 hover bar 的时候显示的小窗口, 里面会有一些方便查看的数据.

    有 2 个常用到的配置 mode, position

    mode 的 default 是 nearest, position 的 default 是 average

    mode: dataset 是说把每个动物指定的 legend 都显示出来

    mode: index 则是把当前的动物所有 legend 显示出来

    mode: nearest 和 point 感觉是一样的. 就是显示指定的动物和 legend

    mode: X 和 Y, 这个就是看一条线上有 hit 到的就显示出来 (我不清楚什么场景会用到这个方式)

    Custom Tooltip

    自定义 position

    import { Chart, registerables, Tooltip } from 'chart.js';
    Chart.register(...registerables);
    const tooltipPlugin = Chart.registry.getPlugin('tooltip')! as typeof Tooltip;
    const customPositioner: typeof Tooltip['positioners']['whatever'] = (_items, eventPosition) =>
      eventPosition;
    tooltipPlugin.positioners.customPositioner = customPositioner;

    配置

    自定义显示

    有时候会需要自己做 tooltip 显示信息, 需要利用到原生数据加以改造了.

    通过 external 方法, 拦截 hover 的瞬间, 然后从 tooltip 对象里面或者到我们想要的数据, 接下来就是自己创建 div append 定位 to body.

    opacity 0, 1 表示 tooltip 是否要显示

    caretX 和 caretY 是 tooltip 的显示坐标, 这个会依据 position 配置而改变哦. 

    左边 X, Y 对准的是 canvas.左上角到显示 tooltip 的地方, 默认的 position 当你 hover 进 dog 绿色 bar 时, tooltip 的位置时 bar 的中上方.

    dataIndex 和 datasetIndex 就是你 hover 着的 bar 是第几个哪个动物和哪个 legend

    如果想获取 bar 的 width, heigth 可以通过 element, element 需要强转成 BarElement 然后通过 getProps 方法才可以获取到哦. (p.s js runtime 的时候, 其实只需要 element.width 就可以拿到了哦)

  • 相关阅读:
    [AT2064] [agc005_f] Many Easy Problems
    [AT2304] [agc010_c] Cleaning
    [AT2172] [agc007_e] Shik and Travel
    [AT2148] [arc063_c] Integers on a Tree
    [AT2363] [agc012_c] Tautonym Puzzle
    未能从程序集“netstandard, Version=2.0.0.0......”中加载类型“...”。
    Android Studio设置国内镜像代理
    新建一个浏览器APP
    Android Studio在Make Project时下载Grandle特别慢
    用JS添加和删除class类名
  • 原文地址:https://www.cnblogs.com/keatkeat/p/15366170.html
Copyright © 2011-2022 走看看