[ccchart] WebSocketサーバーが送り出すJSONデータのためのコンバート関数

ここでは、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でプラグインを追加できるバージョンをリリースしますので、この関数はそれで追加すると便利になるかも。こうご期待^^


v1.12.03で上記プラグインをccchart.wscase.allColsAtATimeとして標準機能に入れました。

thanx fujiichiさん。

<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>