D3 チャート
 ここでは、データの可視化ツールの D3.js(Data-Driven Documents) について記述します。
 D3.jsは、JSON、XML、CSV などの各形式のデータをウェブブラウザ上で可視化する JavaScript ライブラリです。描画は主に SVG を使用します。D3.js を使うには、HTML、CSS、JavaScript、SVG などの基本知識が必要です。
 まず、その具体的な例から見てみます。 参考1  参考2  参考3  参考4  参考5

■ D3.js を使う

 D3.js を使うには、
  1. 使用するデータを読込み、
  2. グラフを表示するSVG要素の作成し、
  3. 軸(目盛り)を作成し、
  4. グラフを作成します。
 具体例で見てみると、
  1. データ型式は、配列データは勿論、csvやJSON、数式等でも提供できます。 
    この例では、データとして「年月」「最高気温」「最低気温」の配列データを利用します
    var tokyo = [
        ['2016/01', 10.6, 1.8],
        ['2016/02', 12.2, 3.1],
        ['2016/03', 14.9, 6.1],
        ['2016/04', 20.3, 11.3],
        ['2016/05', 25.2, 15.7],
        ['2016/06', 26.3, 19.1],
        ['2016/07', 29.7, 22.1],
        ['2016/08', 31.6, 23.9],
        ['2016/09', 27.7, 21.9],
        ['2016/10', 22.6, 15.3],
        ['2016/11', 15.5, 8.1],
        ['2016/12', 13.8, 4.5]
    ];
  2. SVG(Scalable Vector Graphics)要素の作成
    ID名result要素に横幅w、縦幅hのsvg要素を追加します
    var svg = d3.select("#result") // ID名resultの要素を指定
      .append("svg")               // svg要素を追加
        .attr("width", w+20)       // svg要素の横幅値wを指定
        .attr("height", h);        // svg要素の縦幅値hを指定
  3. 軸(目盛り)を作成 参考
    使用するデータの値と、表示幅を対応させるためにスケール処理を行います
    // 軸
    var xScale = d3.time.scale()
      .domain([new Date(2016,0),new Date(2016,11)]) // xの最小,最大値
      .range([0, w - xAxisPad]);    // x目盛の最小,最大値位置
    var yScale = d3.scale.linear()  // y目盛を線形とする
      .domain([ydmax, 0])           // yの最大,最小値
      .range([0, h- yAxisPad]);     // y目盛の最大,最小値位置
    x軸の日付目盛の表示形式を年/月とします
    var xAxis = d3.svg.axis()
      .scale(xScale)
      .tickFormat(d3.time.format("%y/%m")) // x軸の目盛を年/月とする
      .tickSize(7, -h)
      .ticks(7);                           // 目盛表示点数を7とする
    var yAxis = d3.svg.axis()
      .scale(yScale)
      .tickSize(7, -w + xAxisPad)
      .orient("left");                     // y軸を左に配置
    作成した軸にデータの表示位置や表示方法やスタイルを指定します
    svg.append("g")
      .attr("class", "axis")
      .attr("transform","translate("+ xAxisPad +","+(h- yAxisPad)+")")
      .call(xAxis)
      .append("text")
        .attr("x",200)
        .attr("y",33)
        .text("年/月");     // x軸の説明
    svg.append("g")
      .attr("class", "axis")
      .attr("transform","translate("+ xAxisPad +",0)")
      .call(yAxis)
      .append("text")
        .attr("transform","translate(0,"+ h*0.3 +"),rotate(-90)")
        .attr("y",-26)
        .style("text-anchor", "end" )
       .text("気温(℃)");   // y軸の説明
  4. 表示エリアが出来たので、ここに折れ線を記述します
    // 折れ線グラフを描く
    var line = d3.svg.line()
      .x(function(d, i){ return (i * monthW) + xAxisPad; })
      .y(function(d){ return h- yAxisPad- ((h- yAxisPad)/ ydmax* d[1]);});
    var line2 = d3.svg.line()
      .x(function(d, i){ return (i * monthW) + xAxisPad; })
      .y(function(d){ return h- yAxisPad -((h- yAxisPad)/ ydmax *d[2]);});
    svg.append("path")
      .attr("class", "high")
      .attr("d", line(tokyo))
      .attr("stroke", "#ed5454")
      .attr("fill", "none");
    svg.append("path")
      .attr("class", "low")
      .attr("d", line2(tokyo))
      .attr("stroke", "#3874e3")
      .attr("fill", "none");
    ・この折れ線の上に散布図で接続点を上書きします
    // 散布図 --- データ点を表示
    svg.selectAll(".high_circle")
      .data(tokyo)
      .enter()
      .append("circle")
      .attr("class", "high_circle")
      .attr("cx",function(d,i){ return (i * monthW) + xAxisPad; })
      .attr("cy",function(d){ return h- yAxisPad -((h- yAxisPad)/ ydmax *d[1]);})
      .attr("r", 0)
      .attr("stroke", "#ed5454")
      .attr("stroke-width", "1px")
      .attr("fill", "#f8d7d7")
      .transition()
      .duration(1000)
      .attr("r", 4);
    svg.selectAll(".low_circle")
      .data(tokyo)
      .enter()
      .append("circle")
      .attr("class", "low_circle")
      .attr("cx",function(d,i){ return (i * monthW) + xAxisPad; })
      .attr("cy",function(d){ return h- yAxisPad -((h- yAxisPad)/ ydmax *d[2]);})
      .attr("r", 0)
      .attr("stroke", "#3874e3")
      .attr("stroke-width", "1px")
      .attr("fill", "#bdd0f4")
      .transition()
      .duration(1000)
      .attr("r", 4);
    ・更にデータ点の値を上書きするようにします
    // テキスト --- データ点の値を表示
    svg.selectAll(".high_text")
      .data(tokyo)
      .enter()
      .append("text")
      .attr("class", "high_text")
      .text(function(d) { return d[1]; })
      .attr("font-size", "12px")
      .attr("fill", "#ed5454")
      .attr("x",function(d,i){ return (i* monthW)+ xAxisPad- 6; })
      .attr("y", function(d){
        return h- yAxisPad- ((h- yAxisPad)/ ydmax *d[1])+ 16;});
    svg.selectAll(".low_text")
      .data(tokyo)
      .enter()
      .append("text")
      .attr("class", "low_text")
      .text(function(d) { return d[2]; })
      .attr("font-size","12px")
      .attr("fill", "#3874e3")
      .attr("x", function(d, i){ return(i * monthW)+ xAxisPad- 6; })
      .attr("y", function(d){
        return h- yAxisPad- ((h- yAxisPad)/ ydmax* d[2])+ 16;});

    まとめると次のようになります

全リスト

<!doctype html>
<html>
<head>
  <meta http-equiv="Content-Type" charset="UTF-8">
  <title>東京の気温</title>
  <style>
    body { background-color:#EEE; margin:0px auto; }
    #result{ position:relative; width:520px; height:260px;
         margin:10px auto 0; background-color:#FFF; }
    #result svg { position:absolute; top:10px; left:0; }
    #result svg circle { margin:5px 0 0 0; font-size:11px; }
    #result .axis path, #result .axis line{ fill:none; stroke: #666; 
         shape-rendering:crispEdges; }
    #result .axis text { font-size:12px; }
  </style>
  <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
  <script>
    function initiale() {
      var tokyo = [
        ['2016/01', 10.6, 1.8],
        ['2016/02', 12.2, 3.1],
        ['2016/03', 14.9, 6.1],
        ['2016/04', 20.3, 11.3],
        ['2016/05', 25.2, 15.7],
        ['2016/06', 26.3, 19.1],
        ['2016/07', 29.7, 22.1],
        ['2016/08', 31.6, 23.9],
        ['2016/09', 27.7, 21.9],
        ['2016/10', 22.6, 15.3],
        ['2016/11', 15.5, 8.1],
        ['2016/12', 13.8, 4.5]
      ];

      var w = 480; var h = 260;  // SVG要素の幅と高さ
      var xAxisPad = 40; // x軸表示余白
      var yAxisPad = 60; // y軸表示余白
      var ydmax = 37; // y軸max値
      var displayNum = tokyo.length- 1; // 表示月数
      var monthW = (w - xAxisPad) / displayNum; // 1月分の横幅

      // SVG(Scalable Vector Graphics)作成
      var svg = d3.select("#result")  // ID名resultの要素を指定
        .append("svg")                // svg要素を追加
          .attr("width", w+20)        // svg要素の横幅値wを指定
          .attr("height", h);         // svg要素の縦幅値hを指定
      svg.append("text")              // タイトル挿入
        .attr("x",50)
        .attr("y",18)
        .attr("font-size", "16px")
        .style("text-anchor", "start" )
        .text("東京 平均最高/最低気温");

      // 軸
      var xScale = d3.time.scale()
        .domain([new Date(2016,0),new Date(2016,11)]) // xの最小,最大値
        .range([0, w - xAxisPad]);    // x目盛の最小,最大値位置
      var yScale = d3.scale.linear()  // y目盛を線形とする
        .domain([ydmax, 0])           // yの最大,最小値
        .range([0, h- yAxisPad]);     // y目盛の最大,最小値位置
      var xAxis = d3.svg.axis()
        .scale(xScale)
        .tickFormat(d3.time.format("%y/%m")) // x軸の目盛を年/月とする
        .tickSize(7, -h)
        .ticks(7);                           // 目盛表示点数を7とする
      var yAxis = d3.svg.axis()
        .scale(yScale)
        .tickSize(7, -w + xAxisPad)
        .orient("left");                     // y軸を左に配置
      svg.append("g")
        .attr("class", "axis")
        .attr("transform","translate("+ xAxisPad +","+(h- yAxisPad)+")")
        .call(xAxis)
        .append("text")
          .attr("x",200)
          .attr("y",33)
          .text("年/月");     // x軸の説明
      svg.append("g")
        .attr("class", "axis")
        .attr("transform","translate("+ xAxisPad +",0)")
        .call(yAxis)
        .append("text")
          .attr("transform","translate(0,"+ h*0.3 +"),rotate(-90)")
          .attr("y",-26)
          .style("text-anchor", "end" )
          .text("気温(℃)");  // y軸の説明

      // 折れ線グラフを描く
      var line = d3.svg.line()
        .x(function(d, i){ return (i * monthW) + xAxisPad; })
        .y(function(d){ return h- yAxisPad- ((h- yAxisPad)/ ydmax* d[1]);});
      var line2 = d3.svg.line()
        .x(function(d, i){ return (i * monthW) + xAxisPad; })
        .y(function(d){ return h- yAxisPad -((h- yAxisPad)/ ydmax *d[2]);});
      svg.append("path")
        .attr("class", "high")
        .attr("d", line(tokyo))
        .attr("stroke", "#ed5454")
        .attr("fill", "none");
      svg.append("path")
        .attr("class", "low")
        .attr("d", line2(tokyo))
        .attr("stroke", "#3874e3")
        .attr("fill", "none");

      // 散布図 --- データ点を表示
      svg.selectAll(".high_circle")
        .data(tokyo)
        .enter()
        .append("circle")
        .attr("class", "high_circle")
        .attr("cx",function(d,i){ return (i * monthW) + xAxisPad; })
        .attr("cy",function(d){ return h- yAxisPad -((h- yAxisPad)/ ydmax *d[1]);})
        .attr("r", 0)
        .attr("stroke", "#ed5454")
        .attr("stroke-width", "1px")
        .attr("fill", "#f8d7d7")
        .transition()
        .duration(1000)
        .attr("r", 4);
      svg.selectAll(".low_circle")
        .data(tokyo)
        .enter()
        .append("circle")
        .attr("class", "low_circle")
        .attr("cx",function(d,i){ return (i * monthW) + xAxisPad; })
        .attr("cy",function(d){ return h- yAxisPad -((h- yAxisPad)/ ydmax *d[2]);})
        .attr("r", 0)
        .attr("stroke", "#3874e3")
        .attr("stroke-width", "1px")
        .attr("fill", "#bdd0f4")
        .transition()
        .duration(1000)
        .attr("r", 4);

      // テキスト --- データ点の値を表示
      svg.selectAll(".high_text")
        .data(tokyo)
        .enter()
        .append("text")
        .attr("class", "high_text")
        .text(function(d) { return d[1]; })
        .attr("font-size", "12px")
        .attr("fill", "#ed5454")
        .attr("x",function(d,i){ return (i* monthW)+ xAxisPad- 6; })
        .attr("y", function(d){
          return h- yAxisPad- ((h- yAxisPad)/ ydmax *d[1])+ 16;});
      svg.selectAll(".low_text")
        .data(tokyo)
        .enter()
        .append("text")
        .attr("class", "low_text")
        .text(function(d) { return d[2]; })
        .attr("font-size","12px")
        .attr("fill", "#3874e3")
        .attr("x", function(d, i){ return(i * monthW)+ xAxisPad- 6; })
        .attr("y", function(d){
          return h- yAxisPad- ((h- yAxisPad)/ ydmax* d[2])+ 16;});
    }; // end of initiale -----------------------
  </script>
</head>
<body onload="initiale()">
  <div id="result"></div>
</body>
</html>

■ 参考サイト