[D3.js] 長條圖
最近在研究 D3.js,他主要是用 svg 來製作可以互動的圖表,網站上有很多範例可以參考,懂得基本的運作原理外其實就有很多圖表可以應用,要能夠自己做出各種很炫的圖表的話就需要花一些時間去研究就是了。
直接用範例說明
- //Width and height
- var w = 600;
- var h = 250;
- //資料
- var dataset = [ 5, 10, 13, 19, 21, 25, 22, 18, 15, 13,
- 11, 12, 15, 20, 18, 17, 16, 18, 23, 25 ];
- var xScale = d3.scale.ordinal()
- .domain(d3.range(dataset.length))
- .rangeRoundBands([0, w], 0.05);
- var yScale = d3.scale.linear()
- .domain([0, d3.max(dataset)])
- .range([0, h]);
- //產生 SVG 物件
- var svg = d3.select("body")
- .append("svg")
- .attr("width", w)
- .attr("height", h);
- //產生長條途
- svg.selectAll("rect")
- .data(dataset) //讀入資料
- .enter()
- .append("rect")
- .attr("x", function(d, i) {
- return xScale(i);
- })
- .attr("y", function(d) {
- //預設原點是左上角, 需要靠高度減掉y座標長條圖才會由下往上長
- return h - yScale(d);
- })
- .attr("width", xScale.rangeBand())
- .attr("height", function(d) {
- return yScale(d);
- })
- .attr("fill", function(d) {
- return "rgb(0, 0, " + (d * 10) + ")";
- })
- .on("click", function(d) {
- console.log(d);
- });
- //Create labels
- svg.selectAll("text")
- .data(dataset)
- .enter()
- .append("text")
- .text(function(d) {
- return d;
- })
- .attr("text-anchor", "middle") //設定文字格式
- .attr("x", function(d, i) {
- return xScale(i) + xScale.rangeBand() / 2;
- })
- .attr("y", function(d) {
- return h - yScale(d) + 14;
- })
- .attr("font-family", "sans-serif")
- .attr("font-size", "11px")
- .attr("fill", "white");
加一些互動
- //Width and height
- var w = 600;
- var h = 250;
- var dataset = [ 5, 10, 13, 19, 21, 25, 22, 18, 15, 13,
- 11, 12, 15, 20, 18, 17, 16, 18, 23, 25 ];
- var xScale = d3.scale.ordinal()
- .domain(d3.range(dataset.length))
- .rangeRoundBands([0, w], 0.05);
- var yScale = d3.scale.linear()
- .domain([0, d3.max(dataset)])
- .range([0, h]);
- //Create SVG element
- var svg = d3.select("body")
- .append("svg")
- .attr("width", w)
- .attr("height", h);
- //Create bars
- svg.selectAll("rect")
- .data(dataset)
- .enter()
- .append("rect")
- .attr("x", function(d, i) {
- return xScale(i);
- })
- .attr("y", function(d) {
- return h - yScale(d);
- })
- .attr("width", xScale.rangeBand())
- .attr("height", function(d) {
- return yScale(d);
- })
- .attr("fill", function(d) {
- return "rgb(0, 0, " + (d * 10) + ")";
- })
- .on("mouseover", function(d) {
- //Get this bar's x/y values, then augment for the tooltip
- var xPosition = parseFloat(d3.select(this).attr("x")) + xScale.rangeBand() / 2;
- var yPosition = parseFloat(d3.select(this).attr("y")) / 2 + h / 2;
- //Update the tooltip position and value
- d3.select("#tooltip")
- .style("left", xPosition + "px")
- .style("top", yPosition + "px")
- .select("#value")
- .text(d);
- //Show the tooltip
- d3.select("#tooltip").classed("hidden", false);
- })
- .on("mouseout", function() {
- //Hide the tooltip
- d3.select("#tooltip").classed("hidden", true);
- })
- .on("click", function() {
- sortBars();
- });
- //Define sort order flag
- var sortOrder = false;
- //Define sort function
- var sortBars = function() {
- //Flip value of sortOrder
- sortOrder = !sortOrder;
- svg.selectAll("rect")
- .sort(function(a, b) {
- if (sortOrder) {
- return d3.ascending(a, b);
- } else {
- return d3.descending(a, b);
- }
- })
- .transition()
- .delay(function(d, i) {
- return i * 50;
- })
- .duration(1000)
- .attr("x", function(d, i) {
- return xScale(i);
- });
- };
留言