aono1234
@aono1234

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

chart.jsのtypeプロパティの変え方

chart.jsのtypeプロパティがかえられません

グラフの形式(バブルチャート、線グラフ、棒グラフなど)を選ぶ設定としてtypeというプロパティが用意されています。

インスタンス化した後に、グラフのタイプを変えたいと思い、myChart.type="line";という風にコーディングを追加したのですが変化はありませんでした。しかしその他のmyChart.datasets[0].data[0]=1などでdatasetsは変更できました。またmyChart.datasets[0].type="line"としても変更できました。

もしかしてmyChart.typeはprivate?など設定してあり変更できないようにしてあるのでしょうか?

また別の質問ですが、インスタンス化した後にプロパティの数値を変えても
グラフ表示に変化はなく、myChart.update();によって
表示の更新ができました。
変数・配列などはわざわざこのような操作をしなくてもよいと思うのですが、なぜインスタンスはこのような操作が必要なのでしょうか?また他の言語でもこのようにインスタンスを変える場合は2step必要なのでしょうか?

すみませんがご教授頂けますと幸いです。

質問をまとめますと

①typeプロパティはなぜ変更できないのか?

②インスタンスの更新はなぜ2stepなのか?

③他の言語でも同じ仕様なのか?php・pythonなど

すみませんがご教授いただけますとありがたいです。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.min.js"></script>
    <title>個別分析画面</title>


</head>
<body>
    <div>
        <a href="./top.php">TOP画面に戻る</a>
    </div>
    <div>
        <a href="./time_summary.php"><button>労働時間サマリー</button></a>
    </div>
    <div>
        <a href="./task_summary.php"><button>個別課題一覧</button></a>
    </div>
    <div>
        <a href="./overtime_summary.php"><button>残業時間サマリー</button></a>
    </div>
    <div>
        <a href="./filter.php"><button>比較画面</button></a>
    </div>    
    
    <div>
        <div>
            <input type="radio" id="year" name="term" value='year' onclick="btnClick(this)" checked>
            <label for="year">年別</label>
        </div>
        <div>
            <input type="radio" id="month" name="term" value='month'>
            <label for="month">月別</label>
        </div>
        <div>
            <input type="radio" id="day" name="term" value='day'>
            <label for="day">日別</label>
        </div>
        <div>
            <canvas id="myChart" height="100"></canvas>
        </div>
    </div>

 
    <div>
        <input type="radio" id="plus" name="feeling" value='plus' checked>
        <span>プラス感情</span>
    </div>
    <div>
        <input type="radio" id="minus" name="feeling" value='minus'>
        <span>マイナス感情</span>
    </div>

    
<script>
class edit extends Chart {}
edit.prototype.test3 = function(){
    console.log("test")
}

var ctx = document.getElementById('myChart');
var myChart = new edit(ctx, {
	type: "bar",
	data:{
		labels:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],
		datasets:[
			{
				label:'line1',
				type:'line',
				data:[1,1,1,2,4,4,3],
				backgroundColor: "red",
				borderColor : "rgba(254,97,132,0.8)",
				fill: 'false',
				yAxisID: 'y-axis-2',
			},
			{
				label:'line2',
				type:'line',
				data:[2,3,4,5,6,7,8],
				backgroundColor: "blue",
				borderColor : "rgba(254,97,132,0.8)",
				fill: false,
				yAxisID: 'y-axis-2',
			},
			{
				label:'line3',
				type:'line',
				data:[5,5,5,5,5,5,5,5,5,5,5,5],
				backgroundColor: "red",
				borderColor : "red",
				fill: false,
				yAxisID: 'y-axis-2',
			},
			{
				label:'数値A',
                type:'bar',
				data:[0,0,1,1,1,1,1,3,2,1,],
				backgroundColor: "#00ff7f",
				yAxisID: 'y-axis-sales',
			},
			{
				label:'数値B',
                type:'bar',
				data:[3,3,3,3,3,3,3],
				backgroundColor: "#008000",
				yAxisID: 'y-axis-sales'
			},
            {
				label:'数値C',
                type:'bar',
				data:[3,3,3,3,3,3,3],
				backgroundColor: "skyblue",
				yAxisID: 'y-axis-sales'
			},
		]
	},
	options:{
		title: {                           //タイトル設定
			display: true,                 //表示設定
			fontSize: 18,                  //フォントサイズ
			text: '月別の数値'                //ラベル//
		},
		legend: {
			display: true,
			position: 'left',
			label:'test', 
		},
		scales:{
			xAxes:[{stacked:true,}],
			yAxes:[{
				id: 'y-axis-sales',//積み上げるY軸
				stacked: true,
				type: 'linear',
				display: true,
				position: 'left',
				ticks: {
					beginAtZero: true,
					min: 0,
					max: 10,
					stepSize: 2,
				},
			},{
				id: 'y-axis-2',//積み上げないY軸
				stacked: true,
				type: 'linear',
				display: true,//隠します
				position: 'right',
				ticks: {
					beginAtZero: true,
					min: 0,
					max: 20,
					stepSize: 5,
				},
			}]
		},
	}
});


myChart.data.labels[4]=4;//変更可能
myChart.data.datasets[0].type="bar";//変更可能
myChart.data.datasets[0].yAxisID='y-axis-sales';//変更可能
myChart.type="line";//変更不可能
myChart.update();

</script>

</body>
</html>
0

1Answer

ドキュメントをさらっと見ると、chart.typeよりも、datasetsの中のtypeが優先されるようです。

以下の操作が効くかどうか、もう少しシンプルなデータで確認してみると良いと思います。

myChart.type="line";//変更不可能
myChart.update();

0Like

Comments

  1. @aono1234

    Questioner

    毎度ありがとうございます。
    添付のURLを参考にシンプルなデータで検証したところ、(datasetsの中のtypeは消しました)
    インスタンス化した際type: "bar"にしておき、
    myChart2.config.type="line";
    myChart2.update();
    という風に入力すればインスタンス後に変更できました。

    しかし、
    インスタンス化した際にtype: "line"にしておき、
    myChart2.config.type="bar";
    myChart2.update();
    とするとグラフ自体が消えてしまいました。(変更はしていますが…)
  2. これはまた別の問題なので、この質問は閉じて新しい質問を作ることをお勧めします。現在試してるソースコードも必要ですし。
    ただ、(このライブラリをよく知りませんが)myChart2.config.typeではなくmyChart2.typeというプロパティはありませんでしたか?そこだけ気になりました。
  3. @aono1234

    Questioner

    アドバイスありがとうございます。また別で質問させていただきます。myChart2.typeのプロパティ数値の変更ではグラフに変化はありませんでした。(多分プロパティがない)
    またconsole.dir(myChart2.type);でも調べましたが、undefainedという表示が返ってくるのみです。

Your answer might help someone💌