0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Gridsome入門 SPAを作ってみよう 【4日目 棒グラフ編】

Last updated at Posted at 2020-08-11

スケジュール

前提条件

  • node.js v8.3以上
  • yarn or npmが入っている(Document見るとyarnの方が推奨とのこと)
  • Gridsomeのプロジェクトを作成している

前回同様vue-chart.jsでグラフを作成

その前に前回作ったcomponents名を変更

前回src/components/Chart.vueというコンポーネントを作りましたが、今回グラフのコンポーネントをもう一つ作るので名前を変更していきましょう。
変更前src/components/Chart.vue
変更後src/components/chart/Doughnut.vue
適宜このコンポーネントを読み込んでいたpageなども変更が必要です。

新たに棒グラフ用のコンポーネントを作る

棒グラフ用はimport { Bar } from 'vue-chartjs'で使えるようになります。
棒グラフを使うときの注意点はoptionsのscalesを指定しない場合、datasetsで渡した最小値が棒グラフのメモリの最小値になってしまうので見ずらかったです。
実際の作成したコンポーネントはこちら

src/components/chart/Bar.vue
<script>
import { Bar } from 'vue-chartjs'
export default {
  extends: Bar,
  name: 'bar',
  props: ['labels','chartData'],
  data () {
    return {
      chartLabel: 'Asset transition',
      options: {
        tooltips: {
          callbacks: {
            label: function(tooltipItem, data) {
              const currentData = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
              return '$' + currentData;
            },
          }
        },
        scales: {
          yAxes: [
            {
              ticks: {
                min: 0, // グラフのメモリ最小値
                max: this.upperData() // グラフのメモリ最大値(渡したdatasetsの最大*1.2にしている)
              }
            }
          ]
        }
      }
    }
  },
  mounted () {
    this.renderChart(
        {
          labels: this.labels,
          datasets: [
            {
              backgroundColor: 'rgba(137,255,255,1)',
              data: this.chartData,
              label: this.chartLabel,
            }
          ]
        },
        this.options)
  },
  methods: {
    upperData: function () {
      const maxData = Math.max.apply(null, this.chartData) * 1.2;
      return parseInt(maxData, 10);
    }
  }
}
</script>

また今回はpropsを使って親から子componentsに値を渡しています。props: ['labels','chartData'],ここで指定。

src/pages/asset-transition/index.vue
<template>
  <Layout>
    <h1>Asset transition</h1>
    // labels,chartDataというkeyで渡す
    <bar :labels="labels" :chartData="chartData"></bar>
  </Layout>
</template>

<script>
import Bar from "../../components/chart/Bar";
export default {
  components: {
    Bar
  },
  data() {
    return {
      labels: ['202001', '202002', '202003', '202004', '202005','202006','202007', '202008'],
      chartData: [10000, 11000, 11500, 11300, 12100, 12500, 20000, 19000],
    }
  },
  metaInfo: {
    title: 'Hello, world!'
  }
}
</script>

<style>
.home-links a {
  margin-right: 1rem;
}
</style>

出来上がった棒グラフはこちら

demo.gif

あとがき

昨日は折れ線グラフにしようかなあと思っていましたが、やっぱ棒グラフに変更。今回使うグラフこれで以上かな。たぶん。
明日はCSVからデータを読み込む処理に入る予定。
今日は暑いからアイスが美味しい。セブンのチョコミント氷最高。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?