Day13 在图表做标记仿前朝的飘逸 就当我为highlight你伏笔

  • Text marker and cursor marker

继昨天的cursor外,我们也常需要在图表上标记增进阅读性。今天结果的组合包如下,可以加水平线、垂直线、文字或区域上色。
https://ithelp.ithome.com.tw/upload/images/20210914/20141158GcNjjsmX4B.jpg

我们可以参考这个影片说明,我们在图表的配置物件(config)中加上plugins属性(注意并不是在options中),并具有我们要增加的变数的序列([pluginSet]):

const config = {
  type: "scatter",
  data: data,
  options: {
  },
  plugins: [pluginSet]
};

然後我们来定义这个要增加的变数,先以水平线为例:

const pluginSet = {
  id: 'pluginSet',
  beforeDraw(chart, args, options) {
    const {
      ctx, 
      chartArea: {top, bottom, right, left, height, width},
      scales: {x, y}
    } = chart;
    ctx.save(); 
    let x0, yo, dx, dy;
    // horizental line
    y0 = y.getPixelForValue(0.6);
    ctx.strokeStyle = 'rgb(0, 0, 0)';
    ctx.strokeRect(left, y0, width, 0); //x0, y0, deltaX, deltaY
    ctx.restore();
  }
};

使用beforeDraw这个function来动作(beforeDraw和afterDraw会有压在资料图的下方还是盖在上方的差异),然後我们可以看做固定起手式来读取图表的参数,接着以水平线为例,我们先设定水平线的特性,例如颜色(strokeStyle),然後以strokeRect这个function画上线,而要输入的参数分别为起点的x值、y值以及宽度和高度,如果是以图表为基准可以用上方抓进来的top、bottom、right、left、width、height等参数,如果要以资料的区域可以用x或y的getPixelForValue这个function取得。最後再ctx.restore();收尾。
若是标记文字也是同样类似的方式,先设定文字相关参数,例如字型(font),颜色(fillStyle),这边要注意的是对齐方式(textAlign),只有水平方向left、right和center三种可以选择,并无垂直方向,然後是以fillText标记上图表,这个function要输入三个参数分别为:文字内容,座标的X值和Y值,其中这个例子是搭配上面的水平线,所以我们调整Y值加上一半的字型大小让字体不会压在线上,而Y方向加是往下(反之减是往上):

    // text
    const fontSize = 24;
    ctx.textAlign = 'left';
    ctx.font = `${fontSize}px Arial`;
    ctx.fillStyle = 'rgb(0, 0, 0)';
    ctx.fillText("Line at Y=0.6", left, y0 + fontSize / 2);
    ctx.restore();

区域上色也是同样,其中从这个例子可以看到区域是超出Y轴的,表示图表的X轴和Y轴范围并不会受此设定调整:

    //fill
    x0 = x.getPixelForValue(350);
    y0 = y.getPixelForValue(-0.9);
    dx = x.getPixelForValue(550) - x0;
    dy = y.getPixelForValue(0.9) - y0;
    ctx.fillStyle = RGBwithA(CHART_COLORS.red, 0.2);
    ctx.fillRect(x0, y0, dx, dy);
    ctx.restore();

另外我们在beforeDraw还有一个argument叫options,这可以让我们将这些标记的特性用options的属性设定,则我们可以在图表的配置物件(config)中的options,增加plugins,里面再增加这变数的名称,里面就可以设定这些属性。


<<:  Swift纯Code之旅 Day4.「画面分身术 - TableView & AutoLayout」

>>:  【第十四天 - Linked list介绍】

笔记 - 常见演算法时间复杂度

这是在找linked list资料看到harry xie大神文章提到的 里面是常见演算法的时间复杂度...

[Day 17] IOCP 实作

前言 今天简单实践了最基本的 IOCP http server , 原则上是用我第二天写的 one2...

[Day3]odd sum

今天来讲解比较简单又很长出的题目 odd sum 先点选CPE颗星广场 再点选右边的一星 用ctrl...

[Day 32] - 手把手跨出第一步!用JavaScript在Arduino上写出第一支闪烁LED程序-Part 2

大家好,我是17King~ d(`・∀・)b 好久不见,因为最近比较多事情...Orz 但!我没有忘...

04

本人也是经过了深思熟虑,在每个日日夜夜思考这个问题。编译语言的出现,重写了人生的意义。编译语言可以说...