ここでは、WebSocketサーバーから送り出すJSONデータをccchart用にコンバートする関数とカスタマイズについて簡単に説明します。
ccchart の WebSocket 受信処理は、サーバー側から送り出された JSON を受け取り描画します。
サーバーが送り出すデータパターンはいろいろありますが、ccchartでは、いくつかのJSONデータパターンに対応するため、ccchart.wscase というオブジェクトの中にケースごとの変換関数を用意する仕組みを作りました。
たとえば、次のように ws メソッドの後の on イベントメソッド第二引数へその関数を指定すると、
ccchart .init('hoge0', chartdata) .ws('ws://ccchart.com:8016') .on('message', ccchart.wscase.oneColAtATime)
ccchartはリアルタイムにデータを描画してくれます(サンプル)。
このケースでの oneColAtATime 関数がコンバートしてくれるデータパターンは次のような配列です。
[ ["2013"], [435], [600] ]つまり、一度に1列ずつ送られてくる上記のような配列をたとえば、ccchart の次のようなチャートデータの"deta"配列へコンバートして列挿入します。(表示列数は maxWsColLen で指定します)
{ "config": { "title": "WebSocket test", "subTitle": "列データをリアルタイム受信描画 受信パターンはoneColAtATime", "type": "bezi2", "lineWidth": 2, "minY": 0, "xScaleSkip": 3, "maxWsColLen": 18, "colorSet": ["#DDA0DD","#3CB000"] }, "data": [ ["時分",16:28:10,16:28:11,16:28:12,16:28:13,16:28:14,16:28:15,16:28:16], ["データ1",435,332,524,688,774,825,999], ["データ2",600,335,584,333,457,788,900] ]}
今のところは、このほかに多少雑な実装ですが someColsAtATime という関数もあります。一度に複数列ずつ
[ [ ["製品A"], [435], [600] ], [ ["製品B"], [332], [335] ], [ ["製品C"], [524], [584] ] ]といった配列で届く場合です。(サンプル)
ただ、今のところこの二つのパターンしかありません。そこで、もし他のパターンを利用したい場合は、このccchart.wscaseオブジェクト下へ‘自分で‘ カスタマイズ関数を追加して利用します。
コードの例は、ccchart.js内のスクリプトを読んでいただければと思いますが、とりあえず、何も変換しないパターンを例示しておきます。
つまり、次のような ccchart.initのチャートデータとして、そのまますぐに利用できるデータパターンの場合です。
//こんなパターンのJSONデータをサーバーから出力する場合 [ ["日時","00:00","","","","01:00",""], ["製品A","1","4","12","10","0","5"], ["製品B","35","62","56","42","70","60"] ]
このソースは次の通り。
//チャートデータ var chartdata = { "config": { "title": "Customized function for JSON Patterns", "subTitle": "リアルタイム受信描画", "type": "bar", "lineWidth": 2, "maxY": 150, "minY": 0, "xLines": [ {"val":50,"color":"rgba(0,255,255, 0.6)","width":"1"} ], "colorSet": ["#DDA0DD","#3CB000"] }, "data": [//こんなタイプのパターン つまり通常通り ["日時","00:00","","","","01:00",""], ["製品A","1","4","12","10","0","5"], ["製品B","35","62","56","42","70","60"] ] }; //これがカスタマイズした関数。ccchartへ追加する ccchart.wscase.testCase = function (msg) { // こんな風に使います ws.on('message', ccchart.wscase.testCase) //受信処理 try { var msgs = JSON.parse(msg.data); } catch(e) { return } //加工せずにそのまま代入する。( this.op.idはこの場合canvasのid名 'hoge' です) ccchart.ops['hoge'].op.data = msgs; //再起へ ccchart.init('hoge', ccchart.ops[this.op.id].op); } ccchart.wsCloseAll();//念のために一旦クリア //実行 ccchart .init('hoge', chartdata) .ws('ws://ccchart.com:8031') .on('message', ccchart.wscase.testCase)
このサーバーから届いたmsgデータのフォーマットを「加工せずにそのまま代入」している場所で、配列の組み換えを行うことで、さまざまなパターンに対応させることができます。
あと、この辺も参考になるかも> ccchartへWebSocketから流し込む
※追記 2014/3/3 近々ccchartでプラグインを追加できるバージョンをリリースしますので、この関数はそれで追加すると便利になるかも。こうご期待^^
<canvas id="hoge2"></canvas> <script> var chartdata = { "config": { "title": "allColsAtATime at v1.12.03", "subTitle": "リアルタイム受信描画", "type": "bar", "maxY": 150, "minY": 0, "xLines": [ {"val":50,"color":"rgba(0,255,255, 0.6)","width":"1"} ], "colorSet": ["#DDA0DD","#3CB000"] }, "data": [//こんなパターン ["日時","00:00","","","","01:00",""], ["製品A","1","4","12","10","0","5"], ["製品B","35","62","56","42","70","60"] ] }; ccchart.wsCloseAll();//一旦クリア ccchart .init('hoge2', chartdata) .ws('ws://ccchart.com:8031') .on('message', ccchart.wscase.allColsAtATime) </script>