見出し画像

TWSNMP FC:グラフ表示で更に悩む 3日目

今朝も4時に猫に起こされました。もうちょっと寝ていたかったのですが、容赦なしです。私が起きてストーブをつけるのを見た後、猫はかみさんの布団に潜って寝てしましました。
昨日はechartsを使ってTWSNMP FCのグラフを表示することに決めたので、今日からは単に組み込むだけと思っていました。しかし、更に考えることが待っていました。Nuxt(Vue)のコンポーネントで作るか?プラグインで作るか?です。最初、コンポーネントで作ってみました。コンポーネントへのデータの受け渡し方法は、

を参考にして作りました。
こんな感じです。

<template>
 <div id="logCountChart"></div>
</template>

<script>
import * as echarts from 'echarts'

export default {
 props: {
   chartData: {
     type: Array,
     required: true,
   },
 },
 data: () => {
   return {
     chart: null,
   }
 },
 watch: {
   chartData: (newVal, oldVal) => {
     console.log(newVal, oldVal)
     this.chart.setOption({
       series: [
         {
           data: newVal,
         },
       ],
     })
     this.chart.resize()
   },
 },
 mounted() {
   this.chart = echarts.init(document.getElementById('logCountChart'))
   const option = {
     title: {
       show: false,
     },
     // ※一部省略
     series: [
       {
         type: 'bar',
         color: '#1f78b4',
         large: true,
         data: [],
       },
     ],
   }
   this.chart.setOption(option)
 },
}
</script>

<style>
#logCountChart {
 width: 100%;
 height: 200px;
}
</style>

何となく、うまくグラフが表示できたのですが、データを更新した時にグラフを再描画する方法が見つかりません。2時間の作業を捨てて、プラグインで作る方法を試してみました。P5.jsでマップ表示を作った時の学習が役にたちました。作ったプラグインは、

import * as echarts from 'echarts'

let chart

const makeLogCountChart = (div) => {
 chart = echarts.init(document.getElementById(div))
 const option = {
   title: {
     show: false,
   },
   backgroundColor: new echarts.graphic.RadialGradient(0.5, 0.5, 0.4, [
     {
       offset: 0,
       color: '#4b5769',
     },
     {
       offset: 1,
       color: '#404a59',
     },
   ]),
   tooltip: {
     trigger: 'axis',
     formatter: (params) => {
       const p = params[0]
       return p.name + ' : ' + p.value[1]
     },
     axisPointer: {
       type: 'shadow',
     },
   },
   grid: {
     left: '5%',
     right: '5%',
     top: 40,
     buttom: 0,
   },
   xAxis: {
     type: 'time',
     name: '日時',
     axisLabel: {
       color: '#ccc',
       fontSize: '8px',
       formatter: (value, index) => {
         const date = new Date(value)
         return echarts.format.formatTime('MM/dd hh:mm', date)
       },
     },
     nameTextStyle: {
       color: '#ccc',
       fontSize: 10,
       margin: 2,
     },
     axisLine: {
       lineStyle: {
         color: '#ccc',
       },
     },
     splitLine: {
       show: false,
     },
   },
   yAxis: {
     type: 'value',
     name: '件数',
     nameTextStyle: {
       color: '#ccc',
       fontSize: 10,
       margin: 2,
     },
     axisLine: {
       lineStyle: {
         color: '#ccc',
       },
     },
     axisLabel: {
       color: '#ccc',
       fontSize: 8,
       margin: 2,
     },
   },
   series: [
     {
       type: 'bar',
       color: '#1f78b4',
       large: true,
       data: [],
     },
   ],
 }
 chart.setOption(option)
 chart.resize()
}

const showLogCountChart = (logs) => {
 const data = []
 let count = 0
 let ctm
 logs.forEach((e) => {
   if (!ctm) {
     ctm = Math.floor(e.Time / (1000 * 1000 * 1000 * 60))
     count++
     return
   }
   const newCtm = Math.floor(e.Time / (1000 * 1000 * 1000 * 60))
   if (ctm !== newCtm) {
     let t = new Date(ctm * 60 * 1000)
     data.push({
       name: echarts.format.formatTime('yyyy/MM/dd hh:mm:ss', t),
       value: [t, count],
     })
     for (; ctm < newCtm; ctm++) {
       t = new Date(ctm * 60 * 1000)
       data.push({
         name: echarts.format.formatTime('yyyy/MM/dd hh:mm:ss', t),
         value: [t, 0],
       })
     }
     count = 0
   }
   count++
 })
 chart.setOption({
   series: [
     {
       data,
     },
   ],
 })
 chart.resize()
}

export default (context, inject) => {
 inject('makeLogCountChart', makeLogCountChart)
 inject('showLogCountChart', showLogCountChart)
}

使う側vueファイルのテンプレートに、

      <div id="logCountChart" style="width: 100%; height: 200px"></div>

のように書いて、スクリプトに

  mounted() {
   this.$makeLogCountChart('logCountChart')
   this.$showLogCountChart(this.logs)
 },

のように書けば、

画像1

のように表示できました。嬉しい!

これで、グラフ表示の悩みは全て解決だと思います。ついでに、ログのテーブル表示の列幅の悩みも解決できました。

      headers: [
       { text: '状態', value: 'Level', width: '10%' },
       { text: '発生日時', value: 'TimeStr', width: '15%' },
       { text: '種別', value: 'Type', width: '10%' },
       { text: '関連ノード', value: 'NodeName', width: '15%' },
       { text: 'イベント', value: 'Event', width: '50%' },
     ],

のように、widthを割合で設定すれば、いい感じになりました。

テーブルとグラフを表示するパターンのページの作り方が確立したので、明日からページの量産に入りたいと思っています。
明日に続く。​

いいなと思ったら応援しよう!

twsnmp
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。