Chart.jsのサンプルプログラムを実行したところ、エラーが出てしまいました。
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,958
実現したいこと
https://algorithm.joho.info/programming/javascript/chartjs-csv-data-graph/
上記のWebサイトのサンプルプログラムを動作させたところ、動作せず、要素を確認した所以下のエラーがでていました。
undefined is not an object (evaluating 'array.length')
array.length周辺を見ましたが、おかしいと思う場所は見当たりませんでした。
どなたか助言をいただけるとうれしいです。
環境
OS XのMAMPで動作をさせています。
サンプルソース
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>TEST</title>
<script type="text/javascript" src="main.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.4/Chart.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel='stylesheet' href='style.css' type='text/css'/>
</head>
<body>
<div class="header">
<h1 class="logo">Raspi LO</h1>
<div class="nav" id="currentTime"></div>
<div class="nav" id="currentTemp"></div>
<div class="nav" id="currentHumidity"></div>
<div class="nav" id="currentAirPressure"></div>
<div class="nav" id="currentPm25"></div>
</div>
<div class="wrapper">
<div class="main">
<div class="box">
<h2>Temperature [℃]</h2>
<canvas id="temperature" class="graph"></canvas>
</div>
<div class="box">
<h2>Humidity [%]</h2>
<canvas id="humidity" class="graph"></canvas>
</div>
<div class="box">
<h2>Air Pressure [Pa]</h2>
<canvas id="airPressure" class="graph"></canvas>
</div>
<div class="box">
<h2>PM2.5 [μg/m3]</h2>
<canvas id="pm25" class="graph"></canvas>
</div>
</div>
</div>
</body>
</html>
// CSV to Array 2D
var csvToArray = function(path) {
var csvData = new Array();
var data = new XMLHttpRequest();
data.open("GET", path, false);
data.send(null);
var LF = String.fromCharCode(10);
var lines = data.responseText.split(LF);
for (var i = 0; i < lines.length;++i) {
var cells = lines[i].split(",");
if( cells.length != 1 ) {
csvData.push(cells);
}
}
return csvData;
}
var getDateData = function(date, src) {
var dst = new Array();
for(var i = 0; i < src.length; i++)
if (src[i][0].indexOf(date) !== -1) {
dst.push(src[i]);
}
return dst;
};
var arrayT = function(array){
var arrayT = [];
for (var i = 0; i < array.length; i++) {
for (var j = 0; j < array[i].length; j++) {
(i > 0)? arrayT[j].push(array[i][j]) :arrayT[j] = [array[i][j]];
}
}
return arrayT;
}
var replaceElement = function(array, before, after) {
for(var i=0; i < array.length; i++){
array[i] = array[i].replace(before, after);
}
return array;
}
var getDate = function(day) {
var date = new Date();
date.setDate(date.getDate() + day);
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
return String(year) + "-" + String(month) + "-" + String(day);
}
var drawGraph = function(id, today, yesterday, labels){
var ctx = document.getElementById(id).getContext('2d');
var line1 = {
label:'Today',
data:today,
fill: false,
lineTension: 0,
backgroundColor: "#DE4E33",
borderColor: "#DE4E33",
pointHoverBackgroundColor: "#DE4E33",
pointHoverBorderColor: "#DE4E33",
};
var line2 = {
label:'Yesterday',
data:yesterday,
fill: false,
lineTension: 0,
backgroundColor: "#97DBF2",
borderColor: "#97DBF2",
pointHoverBackgroundColor: "#97DBF2",
pointHoverBorderColor: "#97DBF2",
}
// ラベル(横軸)
var label = labels;
var xAxes = [{
gridLines:{
color: "#5f5f5f",
},
ticks: {
fontColor: "#aaa",
fontSize: 12
}
}]
var yAxes = [{
gridLines:{
color: "#5f5f5f",
},
ticks: {
fontColor: "#aaa",
fontSize: 15,
}
}]
var scales = {xAxes, yAxes};
var legend = {labels:{fontColor:"#eee", fontSize: 15}, position:"bottom"};
// グラフ全体の設定
var option = {scales, legend};
// データの設定
var config = {
type: 'line',
data: { labels: label, datasets: [line1, line2]},
options: option,
}
var myChart = new Chart(ctx, config);
};
window.onload = function () {
var csvData = csvToArray("data.csv");
var today = "2016-12-12 ";
var yesterday = "2016-12-11 ";
//var today = getDate(0);
//var yesterday = getDate(-1);
var dataToday = getDateData(today, csvData);
var dataTodayT = arrayT(dataToday);
var label = replaceElement(dataTodayT[0], today, ""); // 0:00, 1:00, 2:00
var dataYesterday = getDateData(yesterday, csvData);
var dataYesterdayT = arrayT(dataYesterday);
drawGraph('temperature', dataTodayT[1], dataYesterdayT[1], label);
drawGraph('humidity', dataTodayT[2], dataYesterdayT[2], label);
drawGraph('airPressure', dataTodayT[3], dataYesterdayT[3], label);
drawGraph('pm25', dataTodayT[4], dataYesterdayT[4], label);
};
@charset "UTF-8";
body {
background: #222;
color: #fff;
margin: 0;
padding: 0;
line-height: 1;
}
.header {
text-align: center;
padding: 0.5em 0.5em 0.5em 0.5em;
background: #150D0F;
height: 40px;
}
.logo {
width: 400px;
font: 22px "Trebuchet MS", Arial, Helvetica, sans-serif;
color: #eee;
float: left;
}
.nav {
width: 100px;
height: 40px;
padding-top: 5px;
list-style-type: none;
text-align: center;
float: left;
overflow: hidden;
}
.nav a {
font: 20px "Trebuchet MS", Arial, Helvetica, sans-serif;
font-weight: 700;
color: #ba9b89;
text-decoration: none;
}
.nav:hover {
background: #36281f;
}
.wrapper {
clear: left;
overflow: hidden;
margin: 0 auto;
padding: 0;
}
.main {
width: 100%;
float: left;
}
h2 {
border-left: 10px solid #008c00;
color: #eee;
padding: 5px 20px;
font-size:18px;
}
.graph {
border: solid 1px #666;
background: #333;
}
.box {
width: 400px;
padding-right: 20px;
float: left;
}
/* スマホ用(画面サイズ450px以下) */
@media screen and (max-width:450px) {
body {
font-size: 13px;
}
.logo {
width: 200px;
float: none;
}
.nav {
display: none;
}
.wrapper {
width: auto;
padding: 0 10px;
}
.main {
width: auto;
padding: 0;
border: none;
}
.main{
float: none;
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
自己解決しました。
読み込んでいる.csvが私個人で使用しているものに差し替わっていました。
ご迷惑をおかけしました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる