D3.js

データセットと日付を対応させてみる

前回の記事で、JSON形式のデータを扱ったデータには、折れ線グラフの数値だけではなく、年度のデータも含まれています。今回は横軸である下の目盛りにデータのの年数を表示します。

{ year : 2006, value1 : 12, value2 : 92, value3 : 47 },

2006年~2015年の10年分のデータです。値と目盛りを体操させるにはdomain()メソッドとrange()メソッドを使います。縦の目盛りにすでに書いているものを、横の目盛りにするだけです。domain()メソッドに2006年と2015年の値を指定すれば完成です。ただ年数を表す文字列が重なると見にくいので、目盛りの間隔を広げます。目盛りの間隔はticks()メソッドで指定します。ticksメッソドの初期値は10です。今回はその半分であるticks(5)を指定します、

サンプルコードの実行結果はこちら

年数ラベルと「年月」表示にする

横軸に年数が表示されました、カンマが入ったりしています。今度は、年数に見えるように年と月を同時に表示します。月はデータ内には指定されていないので1月とします。
D3.jsには、日付を処理するためのスケールであるd3.time.scale()メソッドがあります。これは他のスケール処理と同様に日付を処理するための関数を返します。

目盛りに日付と年月のように整形して表示するにはtickFormatメソッドを使います。これに関数を指定すると、表示するときに必要なデータと出現順番が渡されます。

D3.jsにはformat()メソッドがあり、数値・日付変換を行う機能があります。今回は、日付に変換したいので、d3.time.formatメソッドを使います。このメソッドは、日付を指定された形式に変換するための関数を返します。これには、表示形式をどのうように整形、置換するかについて特別な「%」で始まる文字を用います。例を挙げると、d3.time.format("%Y年")と書けば、4桁の西暦年を返す関数が返されます。2005年の日付データなら「2005年」という文字列が返されます。

d3.time.format()メソッドで指定できる特別な文字

特別な文字 詳細
%a 週の名前
%A 完全な週の名前
%b 月の名前
%B 完全な月の名前
%c 日付と文字列
%d 月。1桁のときは、先頭に0がつく。
%e 月。1桁のときは、先頭に空白が入る。
%H 時間。24時間
%I 時間。12時間
%j 日にち(000-366)
%m
%M
%L ミリ秒
%p 午前中か午後かを示す。AMかPM
%S
%U 週の番号。日曜始まり(00-53)
%w 曜日を示す。(00-6)
%W 週の番号。月曜始まり(00-53)
%x 日付を示す。%m%d%Yと同じ
%X 時間を示す。%H:%M:%Sと同じ
%y 年数(00-99)
%Z 時間帯・タイムゾーン
%% %の文字

年月を返したいなら下記のように書く。
渡されたデータをyyyy年mm月形式にする。

.tickFormat(function(d,i){
var getYearMonth = d3.time.format("%Y年%m月");
return getYearMonth(d);
})

それと年月を表示するうえやらなければいけないことがあります。domain()メソッドです。目盛りの範囲を指定するときに、下記のように数値ではなく日付を示すオブジェクトを指定します。たとえば、2006年~2015年までの場合は下記の通りです。

.domain( [new Date("2006/1/1"), new Date("2015/1/1") ] )

サンプルコードの実行結果はこちら

●HTMLファイルは記事の上部と同じもので大丈夫です。

年数ラベルを90度回転させて縦に表示する

年月は表示されてますが、横幅が狭く、すべての年月を表示できません。
なので、年月の文字を90度回転させて縦に表示します。縦書きするためのスタイルを書くのではなく、プログラム側で回転させます。

横軸に表示されている目盛りの文字は、text要素を使って表示しているので、横軸を表示する際のselectAll("text")としてtext要素を選択して、transform属性にrotate(90)をしていさせて、目盛りの文字を90度回転させています。
サンプルコードのコメントアウトを消して実行すると確認できます。

-D3.js
-