iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
自我挑戰組

以網頁呈現資料視覺化系列 第 13

Day13 在圖表做標記仿前朝的飄逸 就當我為highlight你伏筆

  • 分享至 

  • xImage
  •  
  • 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,裡面再增加這變數的名稱,裡面就可以設定這些屬性。


上一篇
Day12 再靠近一點點 就不閃躲
下一篇
Day14 老人護眼模式
系列文
以網頁呈現資料視覺化30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言