株式会社スマレジの開発部でスマレジのサーバサイドを作っています

チケットの見える化にチャレンジしてみる(3-1: 準備編 D3.jsの導入(1))

こんばんは!株式会社スマレジ 、開発部のmasaです。

晦日ですねー。masaも先ほど年越し蕎麦を食べたところです。 年の瀬になるとやっぱり一年の反省が頭の中を巡りますね・・・(一年の振り返りは前回の記事で書きましたけど汗)

さて、今回からはのびのびになっていた、D3.jsについて取り扱っていきます。

D3.jsって?

d3js.org

D3.jsは入力されたデータ(Data)を元にDOMを操作(Driven)しブラウザ上に様々な情報をグラフィカルに 表示(Document)するJSのライブラリです。

DOM操作系のライブラリというと、jQueryなんかもそうですし、実際D3.jsはjQueryの代わりに使用することもできます。 ただ、jQueryと違う点として、SVGのDOM要素も手軽に操作することができるところがあります。

注意点として、jQueryと同じDOM操作系のライブラリになるので、仮想DOMを扱うVueやReactと合わせて使用する場合は、 DOMの状態に注意しながら利用する必要があります。

まずは文字を表示させてみる。

というわけで実際に触っていきましょう。まずは背景を黒、文字色を白にしたspan 属性を作成して、 表示させてみます。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>D3.jsの練習</title>
</head>
<body>
<div id="text-area"></div>

<script type="text/javascript" src="js/d3.min.js"></script>
<script type="text/javascript">
    /**
     * div領域(#text-area)にspanで引数の文字列を表示する。
     * 背景は黒、文字色は白。
     */
    function drawSpan(message) {
        const span = d3.create("span")
            .style("color", "white")
            .style("background-color", "black")
            .html(message)
            .node();
        document.getElementById("text-area").appendChild(span);
    }

    drawSpan("Hello D3.js!");
</script>
</body>
</html>

表示してみると、こんな感じです。

f:id:masa2019:20211231222021p:plain
spanの表示

drawSpan()関数が実処理です。ざっくり言うと、d3.~~~の部分で作成する属性、そしてそのプロパティを指定して最後の.node()でDOM化して変数に格納、作成したDOMをappendChild()で既存のdiv要素に埋め込んでいるんですね。

棒グラフを表示させてみる。

次は棒グラフの表示です。ここでは、整数値の入った配列を引数に、その整数をもとに棒グラフを書く処理を作成します。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>D3.jsの練習</title>
</head>
<body>
<div id="chart-area"></div>

<script type="text/javascript" src="js/d3.min.js"></script>
<script type="text/javascript">

    /**
     * div領域(#text-area)にspanで引数の文字列を表示する。
     * 背景は黒、文字色は白。
     */
    function drawBarChart(data) {
        const div = d3.create("div")
            .style("font", "10px sans-serif")
            .style("text-align", "right")
            .style("color", "white");

        div.selectAll("div")
            .data(data)
            .join("div")
            .style("background", "steelblue")
            .style("padding", "3px")
            .style("margin", "1px")
            .style("width", d => `${d * 10}px`)
            .text(d => d);

        document.getElementById("chart-area").appendChild(div.node());
    }

    drawBarChart([10,3,6,8,22,15,1]);
</script>
</body>
</html>

drawBarChart([10,3,6,8,22,15,1]);で指定している引数をベースに、下記のようなグラフが表示されます。

f:id:masa2019:20211231222519p:plain
グラフの例

注目するのは、下記の部分です。

        div.selectAll("div")
            .data(data)  // <-- ここで配列のデータを関連づけて
            .join("div") // <-- 関連づけたデータをどの属性に紐づけるのかを指定
            .style("background", "steelblue") 
            .style("padding", "3px")
            .style("margin", "1px")
            .style("width", d => `${d * 10}px`) // divの横幅を取り込んだdataの値に応じて変更
            .text(d => d); 

data()メソッドで数値情報を読み込み、スタイル指定の中で指定した数値を読み込むことで、div要素の幅を変更しています。

次回はSVG要素を使うケースと、transitionについてご紹介できればと思います。