質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

Q&A

解決済

1回答

3349閲覧

chart.js vue-chartjs chartjs-plugin-annotation の基準線を動的に変化させたい。

latte217

総合スコア19

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

0グッド

0クリップ

投稿2022/02/09 13:16

前提・実現したいこと

chart.js vue-chartjs chartjs-plugin-annotation を使いグラフの作成をしています。
最終的にはAPIで取得したデータのレコード数に応じて、基準線を引きたいと思っています。
(最大値、最小値)

発生している問題・エラーメッセージ

APIの実装の前に、動的に基準線の変更を行うサンプルを作ろうと思っているのですが
options. annotation.annotations[].value に渡す値を変更しても基準線は初期の値から更新されない状態です。

該当のソースコード

Chart.vue

1<template> 2 <div> 3 <div class="small"> 4 <line-chart :chart-data="datacollection" :options="options"></line-chart> 5 <button @click="changevalue">btn</button> 6 </div> 7 </div> 8</template> 9 10<script> 11import LineChart from "./LineChartjs"; 12export default { 13 components: { 14 LineChart, 15 }, 16 data() { 17 return { 18 datacollection: {}, 19 options: {}, 20 anotationValue: "20", //初期値 21 }; 22 }, 23 24 methods:{ 25 changevalue(){ 26 this.anotationValue =10;   //ボタンを押して、value更新 27 } 28 }, 29 30 mounted() { 31 (this.datacollection = { 32 labels: ["January", "February", "March", "April", "May", "June"], 33 datasets: [ 34 { 35 label: "SCIOT-F2-track", 36 backgroundColor: "#f67979", 37 data: [10, 20, 30, 40, 50, 30], 38 }, 39 ], 40 }), 41 this.options = { 42 title: { 43 display: true, 44 fontSize: 35, 45 46 }, 47 scales: { 48 yAxes: [ 49 { 50 ticks: { 51 beginAtZero: true, 52 min: 0, 53 max: 100, 54 stepSize: 10, 55 }, 56 id: "y-axis-1", 57 type: "linear", 58 }, 59 ], 60 61 }, 62 annotation: { 63 annotations: [ 64 { 65 type: "line", 66 scaleID: "y-axis-1", 67 mode: "horizontal", 68 value: this.anotationValue,   // ここで更新してほしい。 69 borderColor: "black", 70 borderWidth: 2, 71 label: { 72 enabled: true, 73 content: "目標", 74 }, 75 }, 76 ], 77 }, 78 responsive: true, 79 maintainAspectRatio: false, 80 }; 81 }, 82}; 83</script> 84

LineChartjs.js

1import { Line, mixins } from 'vue-chartjs' 2import chartjsPluginAnnotation from 'chartjs-plugin-annotation' 3const { reactiveProp } = mixins 4 5export default { 6 extends: Line, 7 mixins: [reactiveProp], 8 props: ['options'], 9 10 mounted() { 11 this.addPlugin(chartjsPluginAnnotation) 12 // this.chartData is created in the mixin. 13 // If you want to pass options please create a local options object 14 this.renderChart(this.chartData, this.options) 15 }, 16 17}

試したこと

LineChart.jsに追加

1watch: { 2 chartData () { 3 this.$data._chart.update() 4 } 5}    //なんの変化もない状態

お力をお貸しください。

補足情報(FW/ツールのバージョンなど)

packegejson

1 "chart.js": "^2.9.3", 2 "chartjs-plugin-annotation": "^0.5.7", 3 "core-js": "^3.6.5", 4 "vue": "^2.6.11", 5 "vue-chartjs": "^3.5.1"

開発環境 VS-CODE
Windows10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

再現確認するのに苦労しました・・
chart.js@3.7.0だとvue-chartjsから使えないようでchart.js@2.9.4にして、
chartjs-plugin-annotation@1.3.1だとchart.jsの2系で使えないようでchartjs-plugin-annotation@0.5.7にして、
chartjs-plugin-annotation@0.5.7にするとchart.js@2.9.4でアノテーションが表示されないためchart.js@2.9.3にして・・


基本的には独自のウォッチャーを使う形になりそうに思いました。

独自のウォッチャー
(新しいデータをプッシュするのではなく)データをたくさん変更するのであれば、独自のウォッチャーを実装するのが一番良いやり方です。 必要に応じて、自分で this.$data._chart.update()または this.renderChart()を呼び出すことができます。

シンプルなwatcherの実装例:

js

1watch: { 2 chartData () { 3 this.$data._chart.update() 4 } 5}

https://vue-chartjs.org/ja/guide/#独自のウォッチャー

オプションの中のvalueだけを変更してもウォッチャーの中から見るとvalueが変わっていなかったようですので、this.options全体を変更してみました。
( https://vue-chartjs.org/ja/guide/#例 に記載されているRandomChart.vueはthis.datacollection全体のデータを変更しているようでしたので、こちらを参考にしました)
(スプレッド構文はあまり詳しくないため適切ではないかもしれません・・)
(ウォッチャーの記述の仕方によってはオプションの中だけが変わった場合もウォッチできるのかもしれません)

js

1// Chart.vue 2 changevalue() { 3 this.anotationValue = 10 4 const op = { ...this.options } 5 op.annotation.annotations[0].value = this.anotationValue 6 this.options = op

オプションをウォッチするようにしてrenderChartすると動的に表示が変わるようになりました。
(this.$data._chart.update()だとアノテーションは動的に変わりませんでした)

js

1// LineChartjs.js 2 watch: { 3 options () { 4 this.renderChart(this.chartData, this.options) 5 } 6 }

追記です(チャートライブラリーについて)

また、モジュール関係のバージョンが古いものを利用している ("chart.js": "^2.9.3",等・・)のも気になっているところです。
xg63ex2b 様のほうで、もしグラフや、基準線、(Vueで利用できるもの)で おすすめなものがありましたら、教えていただければありがたいです。

古いパッケージは気になりますよね。
ちょっと探してみたら気になるパッケージを見つけましたので、コメントではなく、回答に追記させていただくことにしました。

vue-chart-3 is rewrite of vue-chartjs for Chart.js 3 for Vue 2 & 3, but written in Typescript and Vue Composition API.
vue-chart-3 は、Vue 2 & 3 用の Chart.js 3 の vue-chartjs のリライト版ですが、Typescript と Vue Composition API で記述されています。
https://vue-chart-3.netlify.app/guide/#introduction

https://www.npmjs.com/package/vue-chart-3

vue-chartjsがChart.js 3に対応していないのが問題だから、vue-chartjsが対応するまで待つしかないかと思っていたら、
Chart.js 3 に対応したものが別のパッケージ(vue-chart-3)として存在しているようでした。
Chart.js自体の2と3で互換性が少しなさそうな感じもしますが、古いパッケージを今から使い始めてしまうより、新しいもので開始した方が良さそうに思いました。
(試していませんが、chartjs-plugin-annotationも1系が使えるようになるかもしれませんね)

私自身、Vue.jsはほとんど使ったことがなく、、
チャートライブラリー単体で言うと、HighchartsとかD3.jsとか使ってみたことがありますが、
Vueと組み合わせるとなると、、Chart.jsが無難そうな印象を受けました。

投稿2022/02/10 01:04

編集2022/02/10 06:20
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

latte217

2022/02/10 01:36

xg63ex2b 様 早速回答いただきましてありがとうございます。 再現にお手間おかけして申し訳ありません・・・ 私もいろいろ調べて、最終的に、上記のPackageJsonのバージョンに固定してやっと動きました。 おかげ様で、期待通りの動きが実装できました! また、モジュール関係のバージョンが古いものを利用している ("chart.js": "^2.9.3",等・・)のも気になっているところです。 xg63ex2b 様のほうで、もしグラフや、基準線、(Vueで利用できるもの)で おすすめなものがありましたら、教えていただければありがたいです。
latte217

2022/02/11 10:09

xg63ex2b 様 ご丁寧な情報をいただきましてありがとうございます! 追加のコメントとさせていただきます。 私も時間を見て、いろいろ試してみようと思います。 vue-chart-3 は一度テストしてみます! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問