INDEX
D3.jsについての解説
D3.jsは、データ駆動型のドキュメント操作を実現する強力なJavaScriptライブラリです。HTML、SVG、CSSを利用して、データを視覚的に表現することが可能です。インタラクティブなグラフ、アニメーション、動的データの表示など、多様な表現を行うために広く使用されています。
D3.jsの実装方法
D3.jsを使用するためには、以下のコードを<head>内に記述してライブラリを読み込みます。
<script src="https://d3js.org/d3.v7.min.js"></script>
D3.jsの特徴
特徴 | 説明 |
---|---|
データバインディング | データとDOM要素を結びつけて、動的に要素を生成・操作できます。 |
インタラクティブなビジュアライゼーション | ユーザーの操作に応じて、グラフの要素を動的に変更・操作することができます。 |
柔軟なカスタマイズ | スタイルやアニメーションをカスタマイズし、見た目を自由にコントロールできます。 |
多様なグラフ形式 | 棒グラフ、円グラフ、線グラフ、散布図など、多くのグラフ形式をサポートしています。 |
プロパティとその値の一覧表
プロパティ名 | 説明 | 値の例 |
---|---|---|
d3.select() | DOM要素を選択します。 | d3.select(“#chart”) |
d3.append() | 新しい要素を選択したDOMに追加します。 | d3.append(“svg”) |
d3.scaleLinear() | 線形スケールを生成します。 | d3.scaleLinear().domain([0, 100]).range([0, 500]) |
d3.axisBottom() | X軸を作成します。 | d3.axisBottom(xScale) |
d3.line() | 線グラフを作成します。 | d3.line().x(d => d.x).y(d => d.y) |
アニメーション付き棒グラフを作成する例
実行例
HTMLとJavaScriptコード
// SVG要素をHTMLに追加
<svg id="barChart"></svg>
// D3.jsでアニメーション付きの棒グラフを作成
<script>
const dataBar = [30, 50, 80, 120, 150]; // グラフのデータ
const widthBar = 500, heightBar = 200; // グラフの幅と高さ
// SVG要素の選択と設定
const svgBar = d3.select("#barChart")
.attr("width", widthBar)
.attr("height", heightBar);
// データに基づいて棒グラフの要素を追加
svgBar.selectAll("rect")
.data(dataBar)
.enter()
.append("rect")
.attr("x", (d, i) => i * 100) // X座標
.attr("y", heightBar) // Y座標(最初は0)
.attr("width", 80) // 幅
.attr("height", 0) // 高さ(最初は0)
.attr("fill", "steelblue") // 色
.transition() // アニメーションの開始
.duration(1000) // アニメーションの持続時間
.attr("y", d => heightBar - d) // Y座標を更新
.attr("height", d => d); // 高さをデータに基づいて更新
</script>
解説
この棒グラフの例では、D3.jsを使ってアニメーションを追加し、データの変化に応じて棒の高さがスムーズに変わるようにしています。アニメーションは1秒の間に実行されます。
円グラフを作成する例
実行例
HTMLとJavaScriptコード
// SVG要素をHTMLに追加
<svg id="pieChart"></svg>
// D3.jsで円グラフを作成
<script>
const dataPie = [10, 20, 30, 40]; // 円グラフのデータ
const widthPie = 300, heightPie = 300, radius = Math.min(widthPie, heightPie) / 2;
// SVG要素の選択と設定
const svgPie = d3.select("#pieChart")
.attr("width", widthPie)
.attr("height", heightPie)
.append("g")
.attr("transform", `translate(${widthPie / 2},${heightPie / 2})`);
// 円グラフのアークを作成
const pie = d3.pie()(dataPie);
const arc = d3.arc()
.innerRadius(0) // 内径
.outerRadius(radius); // 外径
// 円グラフのセグメントを追加
svgPie.selectAll("path")
.data(pie)
.enter()
.append("path")
.attr("d", arc) // パスの描画
.attr("fill", (d, i) => d3.schemeCategory10[i]); // 色を設定
</script>
解説
この円グラフでは、D3.jsを使ってデータの割合を視覚的に示しています。各セグメントは異なる色で塗り分けられており、D3の組み込みカラースケールを使用しています。
線グラフを作成する例
実行例
HTMLとJavaScriptコード
// SVG要素をHTMLに追加
<svg id="lineChart"></svg>
// D3.jsで線グラフを作成
<script>
const dataLine = [
{ date: new Date(2023, 0, 1), value: 30 },
{ date: new Date(2023, 1, 1), value: 50 },
{ date: new Date(2023, 2, 1), value: 80 },
{ date: new Date(2023, 3, 1), value: 60 },
{ date: new Date(2023, 4, 1), value: 90 }
]; // 線グラフのデータ
// SVG要素の設定
const svgLine = d3.select("#lineChart")
.attr("width", 500)
.attr("height", 200);
// X軸とY軸のスケール設定
const xScaleLine = d3.scaleTime()
.domain(d3.extent(dataLine, d => d.date))
.range([0, 500]);
const yScaleLine = d3.scaleLinear()
.domain([0, d3.max(dataLine, d => d.value)])
.range([200, 0]);
// 線グラフの生成
const line = d3.line()
.x(d => xScaleLine(d.date))
.y(d => yScaleLine(d.value));
// 線グラフのパスを追加
svgLine.append("path")
.datum(dataLine)
.attr("fill", "none")
.attr("stroke", "steelblue")
.attr("stroke-width", 2)
.attr("d", line); // パスの描画
</script>
解説
この線グラフでは、訪問者数の変動を時系列で表示しています。背景色と枠線を設定することで、グラフの視認性を向上させています。
動的にデータを変更する散布図の例
実行例
HTMLとJavaScriptコード
// SVG要素をHTMLに追加
<svg id="scatterPlot"></svg>
<button id="updateDataButton">データ更新</button>
// D3.jsで動的な散布図を作成
<script>
let dataScatter = [{ x: 30, y: 20 }, { x: 50, y: 70 }, { x: 90, y: 50 }, { x: 120, y: 90 }]; // 散布図の初期データ
// SVG要素の設定
const svgScatter = d3.select("#scatterPlot")
.attr("width", 500)
.attr("height", 200);
// 散布図のデータ更新関数
const updateScatterPlot = () => {
const circles = svgScatter.selectAll("circle")
.data(dataScatter);
// 新しいデータ点の作成
circles.enter()
.append("circle")
.merge(circles) // 既存データとのマージ
.attr("cx", d => d.x * 4) // X座標
.attr("cy", d => 200 - d.y * 2) // Y座標
.attr("r", 5) // 円の半径
.attr("fill", "orange"); // 円の色
// 古いデータ点の削除
circles.exit().remove();
};
// ボタンを押すとデータが更新される
d3.select("#updateDataButton").on("click", function() {
dataScatter = dataScatter.map(d => ({ x: d.x + 10, y: d.y + 10 }));
updateScatterPlot();
});
// 初期状態の描画
updateScatterPlot();
</script>
解説
この散布図の例では、D3.jsを使用して動的にデータを更新する仕組みを作成しています。ボタンをクリックすると、データが更新され、それに応じて散布図の点の位置が自動的に再描画されます。
D3.jsの公式サイト
D3 by Observable | The JavaScript library for bespoke data visualization
The JavaScript library for bespoke data visualization