Skip to content

D3.js グラフの基本

D3.js(Data-Driven Documents)は、データを視覚化するための強力なJavaScriptライブラリです。以下では、基本的なグラフの作成方法を説明します。

棒グラフ

シンプルな縦棒グラフの例:

コードの解説

javascript
// データの定義
const data = [
  { label: "A", value: 10 },
  { label: "B", value: 20 },
  { label: "C", value: 15 },
  { label: "D", value: 25 },
  { label: "E", value: 30 }
];

// SVGのサイズとマージンの設定
const width = 400;
const height = 300;
const margin = { top: 20, right: 20, bottom: 30, left: 40 };

// SVG要素の作成
const svg = d3.select("#bar-chart")
  .append("svg")
  .attr("width", width)
  .attr("height", height);

// X軸のスケール設定
const x = d3.scaleBand()
  .range([margin.left, width - margin.right])
  .domain(data.map(d => d.label))
  .padding(0.1);

// Y軸のスケール設定
const y = d3.scaleLinear()
  .range([height - margin.bottom, margin.top])
  .domain([0, d3.max(data, d => d.value)]);

// X軸の描画
svg.append("g")
  .attr("transform", `translate(0,${height - margin.bottom})`)
  .call(d3.axisBottom(x));

// Y軸の描画
svg.append("g")
  .attr("transform", `translate(${margin.left},0)`)
  .call(d3.axisLeft(y));

// 棒グラフの描画
svg.selectAll("rect")
  .data(data)
  .join("rect")
  .attr("x", d => x(d.label))
  .attr("y", d => y(d.value))
  .attr("width", x.bandwidth())
  .attr("height", d => height - margin.bottom - y(d.value))
  .attr("fill", "steelblue");

円グラフ

シンプルな円グラフの例:

コードの解説

javascript
// データの定義
const pieData = [
  { label: "A", value: 30 },
  { label: "B", value: 20 },
  { label: "C", value: 25 },
  { label: "D", value: 15 },
  { label: "E", value: 10 }
];

// SVGのサイズと半径の設定
const pieWidth = 400;
const pieHeight = 400;
const pieRadius = Math.min(pieWidth, pieHeight) / 2;

// SVG要素の作成と中心への移動
const pieSvg = d3.select("#pie-chart")
  .append("svg")
  .attr("width", pieWidth)
  .attr("height", pieHeight)
  .append("g")
  .attr("transform", `translate(${pieWidth/2},${pieHeight/2})`);

// カラースケールの設定
const color = d3.scaleOrdinal()
  .domain(pieData.map(d => d.label))
  .range(d3.schemeCategory10);

// パイチャートのレイアウト設定
const pie = d3.pie()
  .value(d => d.value);

// 円弧の生成器
const arc = d3.arc()
  .innerRadius(0)
  .outerRadius(pieRadius);

// 円グラフの描画
const arcs = pieSvg.selectAll("arc")
  .data(pie(pieData))
  .join("path")
  .attr("d", arc)
  .attr("fill", d => color(d.data.label))
  .attr("stroke", "white")
  .style("stroke-width", "2px");

// ラベルの追加
pieSvg.selectAll("text")
  .data(pie(pieData))
  .join("text")
  .attr("transform", d => `translate(${arc.centroid(d)})`)
  .attr("text-anchor", "middle")
  .text(d => d.data.label);

折れ線グラフ

時系列データを表示する折れ線グラフの例:

コードの解説

javascript
// データの定義
const lineData = [
  { date: "2023-01", value: 10 },
  { date: "2023-02", value: 15 },
  { date: "2023-03", value: 25 },
  { date: "2023-04", value: 20 },
  { date: "2023-05", value: 30 }
];

// SVGのサイズとマージンの設定
const lineWidth = 500;
const lineHeight = 300;
const lineMargin = { top: 20, right: 20, bottom: 30, left: 40 };

// SVG要素の作成
const lineSvg = d3.select("#line-chart")
  .append("svg")
  .attr("width", lineWidth)
  .attr("height", lineHeight);

// X軸のスケール設定(離散的なポイント)
const lineX = d3.scalePoint()
  .range([lineMargin.left, lineWidth - lineMargin.right])
  .domain(lineData.map(d => d.date));

// Y軸のスケール設定
const lineY = d3.scaleLinear()
  .range([lineHeight - lineMargin.bottom, lineMargin.top])
  .domain([0, d3.max(lineData, d => d.value)]);

// 線の生成器
const line = d3.line()
  .x(d => lineX(d.date))
  .y(d => lineY(d.value));

// 軸の描画
lineSvg.append("g")
  .attr("transform", `translate(0,${lineHeight - lineMargin.bottom})`)
  .call(d3.axisBottom(lineX));

lineSvg.append("g")
  .attr("transform", `translate(${lineMargin.left},0)`)
  .call(d3.axisLeft(lineY));

// 線の描画
lineSvg.append("path")
  .datum(lineData)
  .attr("fill", "none")
  .attr("stroke", "steelblue")
  .attr("stroke-width", 2)
  .attr("d", line);

// データポイントの描画
lineSvg.selectAll("circle")
  .data(lineData)
  .join("circle")
  .attr("cx", d => lineX(d.date))
  .attr("cy", d => lineY(d.value))
  .attr("r", 4)
  .attr("fill", "steelblue");

散布図

2つの変数の関係を表示する散布図の例:

コードの解説

javascript
// データの定義
const scatterData = [
  { x: 10, y: 20 },
  { x: 15, y: 25 },
  { x: 20, y: 30 },
  { x: 25, y: 35 },
  { x: 30, y: 40 }
];

// SVGのサイズとマージンの設定
const scatterWidth = 400;
const scatterHeight = 300;
const scatterMargin = { top: 20, right: 20, bottom: 30, left: 40 };

// SVG要素の作成
const scatterSvg = d3.select("#scatter-plot")
  .append("svg")
  .attr("width", scatterWidth)
  .attr("height", scatterHeight);

// X軸のスケール設定
const scatterX = d3.scaleLinear()
  .range([scatterMargin.left, scatterWidth - scatterMargin.right])
  .domain([0, d3.max(scatterData, d => d.x)]);

// Y軸のスケール設定
const scatterY = d3.scaleLinear()
  .range([scatterHeight - scatterMargin.bottom, scatterMargin.top])
  .domain([0, d3.max(scatterData, d => d.y)]);

// 軸の描画
scatterSvg.append("g")
  .attr("transform", `translate(0,${scatterHeight - scatterMargin.bottom})`)
  .call(d3.axisBottom(scatterX));

scatterSvg.append("g")
  .attr("transform", `translate(${scatterMargin.left},0)`)
  .call(d3.axisLeft(scatterY));

// データポイントの描画
scatterSvg.selectAll("circle")
  .data(scatterData)
  .join("circle")
  .attr("cx", d => scatterX(d.x))
  .attr("cy", d => scatterY(d.y))
  .attr("r", 5)
  .attr("fill", "steelblue");