CREATOR BLOG

D3.jsでスライドショーを作ってみる

2015/08/31
近藤
  • このエントリーをはてなブックマークに追加

おはようございます、制作部の近藤です。

今回は、データビジュアライゼーションJavaScriptライブラリ、
D3.jsを使ってスライドショーを作ってみようと思います。


目次

D3.jsのレイアウト

D3.jsには、棒グラフや円グラフなど様々なグラフの表示形式があり、
これをレイアウトと呼びます。

レイアウトには、本当に様々な種類がありますので、興味もたれた方はぜひ本家サイトをご覧ください。

treemapレイアウトは、各データの任意の数値に応じて表示させる四角形の面積を変え、
うまいこと指定領域一杯に敷き詰めることで、各データの比率を分かりやすく表示させるレイアウトです。

例)釣った魚リスト

See the Pen d3 treemap slideshow test1 by kinoborisan (@kinoborisan) on CodePen.


※通常はSVGで、各データの領域をrectで表示するのですが、今回はスライドショー向けにDIVを敷き詰める形にしてます。

The beauty of data visualization - David McCandless
でも、開始1分ちょいくらいのとこで紹介されてますね。

今回は、このtreemapレイアウトを利用したフォトスライドショーを作ります。

treemapの使い方

以下のようなデータがあったとします。

魚の名前 釣れた数
さば 10
いわし 40
キス 4
めじな 2
あじ 22
ごんずい 1

このデータを元に、冒頭の例、「釣った魚リスト」を作ってみましょう。

HTML

まずは、HTMLを準備します。

HTMLの準備は簡単で、数行のstyle記述、
d3.jsの読み込み、スライドショー用のtreemap.jsの読み込みをし、
グラフ描画領域として div#secGraph をbody内に記述するだけです。

JavaScript

以下のJavaScriptは、「treemap.js」として保存してください。

まずは、参考データの配列を記述します。

配列内の各データはオブジェクトにし、name:魚の名前、num:釣った数、として記述します。

さて、ここからお楽しみのD3.jsの記述に入っていきます。

まずは表示領域のサイズを指定し、div#secGraph をD3で選択、グラフ領域描画用のDIVを生成します。

jQueryの記述に似ていますね。d3.selectでDOMを選択し、appendでDIVを追加しています。
そして、.attrでstyle属性を指定し、描画領域のサイズを指示しています。

D3.jsでは、jQueryのように、「.」のチェイン構文でメソッドをつなげていきます。

続いて、データをツリーマップの表示形式にするための準備をします。

var treemapは、D3の関数オブジェクトで、.sizeメソッドで表示領域のサイズを、
.valueメソッドで、レイアウトの基準となる、個別データの値を設定します。
ここでreturnされる数値を元に、
・表示領域内での位置
・横幅
・高さ
などが算出されます。

最後に、描画を行います。

.data()は、D3.jsのもっとも重要なものの一つで、DOMとデータを結びつける働きをします。
.enter()も同じくらい重要なもので、結び付けられたデータに対応して、処理を行う働きを持ちます。
.attr('style',...)では、CSSで要素の背景色や配置・領域などを定義しています。
.text()は、この要素に表示させるテキストを指定できます。

DOMとデータを結びつける一連の流れは、D3.jsの中で一番ダイナミックで面白いところだと思います!

さて、続いてフォトスライドショーの実作に入っていきたいと思います。

D3.jsのtreemapでスライドショー

今回は、弊社サービスのGreenSnapのデータを元に、フォトスライドショーを作ってみたいと思います。

作るもの

完成図は以下です。

See the Pen d3 treemap slideshow 1 by kinoborisan (@kinoborisan) on CodePen.

GreenSnapに投稿されたみなさんの写真を、いいね数に応じて大きく表示させています。
また、スライドショーらしく、画面上部のバーが延びきったところで次のスライドへ遷移する動きも設定しました。

まずは、HTMLから見ていきます。

HTML

魚リストとの違いは、div#bar , div#barInner が追加されているくらいです。

CSS

次に、CSSです。
まずは、表示時間で伸びるバー部分から。

画面上部にバーの枠(div#bar)を、その内側に、バーの幅表示用の枠(div#barInner)を設定しています。
この部分を、d3.jsのtransitionで0→100%と切り替え、そのコールバックで、次のスライドに遷移させる形にしています。

続いて、各写真にもエフェクトを追加します。

.nodeが写真表示の大枠、その内側に、.nodeInnerとして、写真を表示させるための枠を設けています。
.nodeがD3.jsで指示する領域を確保し、.nodeInnerは画像、CSSによるエフェクト(透過・移動)をコントロールする形です。
なお、マウスオーバーでのエフェクトなどは、D3.js側でクラスをトグルしています。

JavaScript

続いて、JavaScriptです。
こちらのJavaScriptは、greensnapSlideshow.jsのファイル名で保存ください。

まずは、画像のパス・ライク数の2項目からなるオブジェクトの配列を準備します。

続いて、スライドショー向けの変数・グラフ描画領域・バー部分を定義します。

スライドショー全体の横幅・高さは、画面サイズ全体に合わせる形で調整しています。
これで、スライドショーの実行準備が整いましたので、つづいて、スライドショーの実行部分を記述します。

ここまでで、バーの初期化・1ページに表示させるスライドの配列準備が完了しました。

続いて、D3.jsのツリーマップの準備と、スライドの配置を行います。

魚マップでは、1回のみの表示でしたが、今回は同一領域に複数回スライドを実行しますので、
データバインドの解除などを行います。

このほか、マウスオーバーやアウトのイベントもここで仕込んでおきます。
D3.jsでのマウスイベントなどの設定は、.onで簡単に行えますので便利ですね。

最後に、背景画像表示用の枠の設定・次のページへの遷移設定などを行います。

以上です。

各画像のフェードインの効果や、スライドが切り替わる際のエフェクトなど、
調整すれば色々と面白い表現が出来るかと思いますので試してみてください。

まとめ

今回は、GreenSnapの画像をお借りしてスライドショーにしてみました。
データと絡めてアレンジすることで、より興味深い文脈が作れる気がしました。

いいね数/ポイント/価格など、数値が絡む写真のスライドショーには適しているかと思います。
漁獲高に応じたお魚図鑑とか、釣りえさごとの釣果写真図鑑とかいいですね。

もちろん、外部のAPIを使う場合には、レギュレーションはしっかり守って使いましょう。

D3.jsの可視化の力は、とても楽しいものが出来そうですね。

Recent Entry

CSSの単位まとめ pxからvm/vh/vmin/vmaxまで

レスポンシブHTMLメールを作ってみての感想

CSSのリファクタリングでした5つのこと

大人が読んでも頭を使う絵本の紹介

サイト内にうまくInstagramを取り入れてるサイト11選

Category

Archive