
- D3.js 教程
- D3.js - 首頁
- D3.js - 簡介
- D3.js - 安裝
- D3.js - 概念
- D3.js - 選擇器
- D3.js - 資料連線
- D3.js - SVG 簡介
- D3.js - SVG 變換
- D3.js - 過渡動畫
- D3.js - 動畫
- D3.js - 繪製圖表
- D3.js - 圖表
- D3.js - 地理資料
- D3.js - 陣列 API
- D3.js - 集合 API
- D3.js - 選擇器 API
- D3.js - 路徑 API
- D3.js - 縮放 API
- D3.js - 軸 API
- D3.js - 形狀 API
- D3.js - 顏色 API
- D3.js - 過渡動畫 API
- D3.js - 拖拽 API
- D3.js - 縮放 API
- D3.js - 請求 API
- 分隔符分隔值 API
- D3.js - 定時器 API
- D3.js - 例項演示
- D3.js 有用資源
- D3.js - 快速指南
- D3.js - 有用資源
- D3.js - 討論
D3.js - 例項演示
本章我們將製作一個動畫條形圖。本例中,我們將使用上一章人口記錄中使用的 data.csv 檔案作為資料集,並生成一個動畫條形圖。
為此,我們需要執行以下步驟:
步驟 1 − 應用樣式 − 使用以下程式碼應用 CSS 樣式。
<style> .bar { fill: green; } .highlight { fill: red; } .title { fill: blue; font-weight: bold; } </style>
步驟 2 − 定義變數 − 使用以下指令碼定義 SVG 屬性。
<script> var svg = d3.select("svg"), margin = 200, width = svg.attr("width") - margin, height = svg.attr("height") - margin; </script>
步驟 3 − 新增文字 − 現在,新增文字並使用以下程式碼應用變換。
svg.append("text") .attr("transform", "translate(100,0)") .attr("x", 50) .attr("y", 50) .attr("font-size", "20px") .attr("class", "title") .text("Population bar chart")
步驟 4 − 建立比例範圍 − 在此步驟中,我們可以建立一個比例範圍並新增組元素。定義如下。
var x = d3.scaleBand().range([0, width]).padding(0.4), y = d3.scaleLinear() .range([height, 0]); var g = svg.append("g") .attr("transform", "translate(" + 100 + "," + 100 + ")");
步驟 5 − 讀取資料 − 我們已經在之前的示例中建立了 data.csv 檔案。這裡我們使用同一個檔案。
year,population 2006,40 2008,45 2010,48 2012,51 2014,53 2016,57 2017,62
現在,使用以下程式碼讀取上述檔案。
d3.csv("data.csv", function(error, data) { if (error) { throw error; }
步驟 6 − 設定域 − 現在,使用以下程式碼設定域。
x.domain(data.map(function(d) { return d.year; })); y.domain([0, d3.max(data, function(d) { return d.population; })]);
步驟 7 − 新增 X 軸 − 現在,您可以將 X 軸新增到變換中。如下所示。
g.append("g") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x)).append("text") .attr("y", height - 250).attr("x", width - 100) .attr("text-anchor", "end").attr("font-size", "18px") .attr("stroke", "blue").text("year");
步驟 8 − 新增 Y 軸 − 使用以下程式碼將 Y 軸新增到變換中。
g.append("g") .append("text").attr("transform", "rotate(-90)") .attr("y", 6).attr("dy", "-5.1em") .attr("text-anchor", "end").attr("font-size", "18px") .attr("stroke", "blue").text("population");
步驟 9 − 新增組元素 − 現在,新增組元素並將變換應用於 Y 軸,如下所示。
g.append("g") .attr("transform", "translate(0, 0)") .call(d3.axisLeft(y))
步驟 10 − 選擇 bar 類 − 現在,選擇 bar 類中的所有元素,如下所示。
g.selectAll(".bar") .data(data).enter() .append("rect") .attr("class", "bar") .on("mouseover", onMouseOver) .on("mouseout", onMouseOut) .attr("x", function(d) { return x(d.year); }) .attr("y", function(d) { return y(d.population); }) .attr("width", x.bandwidth()) .transition() .ease(d3.easeLinear) .duration(200) .delay(function (d, i) { return i * 25; }) .attr("height", function(d) { return height - y(d.population); }); });
在這裡,我們添加了 mouseout 和 mouseover 監聽器事件來執行動畫。當滑鼠懸停在特定條形圖上並移出時,它會應用動畫。這些函式將在後續步驟中解釋。
.ease(d3.easeLinear) 函式用於在動畫中執行明顯的運動。它以 200 的持續時間處理慢入和慢出運動。延遲可以使用以下方法計算:
.delay(function (d, i) { return i * 25; })
步驟 11 − 滑鼠懸停事件處理程式函式 − 讓我們建立一個滑鼠懸停事件處理程式來處理滑鼠事件,如下所示。
function onMouseOver(d, i) { d3.select(this) .attr('class', 'highlight'); d3.select(this) .transition() .duration(200) .attr('width', x.bandwidth() + 5) .attr("y", function(d) { return y(d.population) - 10; }) .attr("height", function(d) { return height - y(d.population) + 10; }); g.append("text") .attr('class', 'val') .attr('x', function() { return x(d.year); }) .attr('y', function() { return y(d.value) - 10; }) }
在這裡,在滑鼠懸停事件中,我們想要增加所選條形的寬度和高度,並將所選條形的顏色更改為紅色。對於顏色,我們添加了一個名為“highlight”的類,它將所選條形的顏色更改為紅色。
一個持續時間為 200 毫秒的條形過渡函式。當我們將條形的寬度增加 5px,高度增加 10px 時,條形從之前的寬度和高度到新的寬度和高度的過渡將持續 200 毫秒。
接下來,我們計算了條形的新“y”值,以便條形不會因新的高度值而變形。
步驟 12 − 滑鼠移出事件處理程式函式 − 讓我們建立一個滑鼠移出事件處理程式來處理滑鼠事件。定義如下。
function onMouseOut(d, i) { d3.select(this).attr('class', 'bar'); d3.select(this) .transition() .duration(400).attr('width', x.bandwidth()) .attr("y", function(d) { return y(d.population); }) .attr("height", function(d) { return height - y(d.population); }); d3.selectAll('.val') .remove() }
在這裡,在滑鼠移出事件中,我們想要移除我們在滑鼠懸停事件中應用的選擇功能。因此,我們將條形類還原為原始的“bar”類,並恢復所選條形的原始寬度和高度,並將 y 值恢復為原始值。
d3.selectAll(‘.val’).remove() 函式用於刪除我們在條形選擇期間新增的文字值。
步驟 13 − 例項演示 − 完整的程式在下面的程式碼塊中給出。建立一個網頁 animated_bar.html 並新增以下更改。
<!DOCTYPE html> <html> <head> <style> .bar { fill: green; } .highlight { fill: red; } .title { fill: blue; font-weight: bold; } </style> <script src = "https://d3js.org/d3.v4.min.js"></script> <title> Animated bar chart </title> </head> <body> <svg width = "500" height = "500"></svg> <script> var svg = d3.select("svg"), margin = 200, width = svg.attr("width") - margin, height = svg.attr("height") - margin; svg.append("text") .attr("transform", "translate(100,0)") .attr("x", 50).attr("y", 50) .attr("font-size", "20px") .attr("class", "title") .text("Population bar chart") var x = d3.scaleBand().range([0, width]).padding(0.4), y = d3.scaleLinear().range([height, 0]); var g = svg.append("g") .attr("transform", "translate(" + 100 + "," + 100 + ")"); d3.csv("data.csv", function(error, data) { if (error) { throw error; } x.domain(data.map(function(d) { return d.year; })); y.domain([0, d3.max(data, function(d) { return d.population; })]); g.append("g") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x)) .append("text") .attr("y", height - 250) .attr("x", width - 100) .attr("text-anchor", "end") .attr("font-size", "18px") .attr("stroke", "blue").text("year"); g.append("g") .append("text") .attr("transform", "rotate(-90)") .attr("y", 6) .attr("dy", "-5.1em") .attr("text-anchor", "end") .attr("font-size", "18px") .attr("stroke", "blue") .text("population"); g.append("g") .attr("transform", "translate(0, 0)") .call(d3.axisLeft(y)) g.selectAll(".bar") .data(data) .enter() .append("rect") .attr("class", "bar") .on("mouseover", onMouseOver) .on("mouseout", onMouseOut) .attr("x", function(d) { return x(d.year); }) .attr("y", function(d) { return y(d.population); }) .attr("width", x.bandwidth()).transition() .ease(d3.easeLinear).duration(200) .delay(function (d, i) { return i * 25; }) .attr("height", function(d) { return height - y(d.population); }); }); function onMouseOver(d, i) { d3.select(this) .attr('class', 'highlight'); d3.select(this) .transition() .duration(200) .attr('width', x.bandwidth() + 5) .attr("y", function(d) { return y(d.population) - 10; }) .attr("height", function(d) { return height - y(d.population) + 10; }); g.append("text") .attr('class', 'val') .attr('x', function() { return x(d.year); }) .attr('y', function() { return y(d.value) - 10; }) } function onMouseOut(d, i) { d3.select(this) .attr('class', 'bar'); d3.select(this) .transition() .duration(200) .attr('width', x.bandwidth()) .attr("y", function(d) { return y(d.population); }) .attr("height", function(d) { return height - y(d.population); }); d3.selectAll('.val') .remove() } </script> </body> </html>
現在,請求瀏覽器,我們將看到以下響應。

如果我們選擇任何條形,它將以紅色突出顯示。D3 是一個通用的視覺化庫,它處理將資料轉換為資訊、文件、元素等,並最終幫助建立資料視覺化。