1. 程式人生 > >D3.js入門例項----製作動態條形圖

D3.js入門例項----製作動態條形圖

1.引入資源--js

<script src="http://d3js.org/d3.v3.min.js"></script>
<script type="text/javascript" src="js/jquery.min.js" ></script>

2.建立svg畫布

var svg=d3.select("body")
        .select(".first")
        .append("svg")
	.attr("width","50%")
	.attr("height","50%")
	.style("padding","20px");

3.新增線性比例尺

var linear = d3.scale.linear()//矩形條比例尺
		.domain([0,d3.max(data2)]) //定義域
		.range([0,250]);  //值域
						
var linear2 = d3.scale.linear()//座標軸比例尺
		.domain([0,5]) //定義域
		.range([125,0]);  //值域

    (1)這裡需要用到一個數組,等會兒畫矩形也會用到這個陣列

var data2 = [ 2.5,2.1,1.7,1.3,0.9 ];

4.畫矩形條

svg.selectAll(".rect")//新增rect矩形元素
    .data(data2)
    .enter()  //迴圈陣列查詢
    .append("rect")
    .attr("class","rect")
    .attr("width","0") //矩形的寬,過渡動畫前
    .attr("height","20") //矩形的高
    .attr("x",rectHeight) //矩形在x軸的位置
    .attr("y",function(d,i){  //矩形在y軸的位置,這裡通過迴圈得到的y依次增加
        return i*rectHeight;
    })
    .transition()   //開啟過渡效果
    .duration(1000) //執行動畫的時間--毫秒
    .delay(function(d,i){ //指定延遲的時間,表示一定時間後才開始轉變,單位同樣為毫秒         return 200*i;     })     .attr("width",function(d){ //過渡後矩形的寬 return linear(d); //迴圈data2陣列得到的值通過linear線性比例尺得到頁面需要的寬     })     .attr("fill","rgb(0,255,255)") //過渡後的矩形填充色     .attr("height",rectHeight-5);

5.新增文字到矩形條上

var texts = svg.selectAll(".MyText")//新增文字
		        .data(data2)
		        .enter()
		        .append("text")
		        .attr("class","MyText")
		        .transition()
		        .duration(1000)
			.delay(function(d,i){
			    return 200*i;
			})
		        .attr("x", function(d,i){
		            return linear(d)-20;
		        } )
		        .attr("y",function(d,i){
		            return i*rectHeight;
		        })
		        .attr("dx",20)
		        .attr("dy",18)
		        .text(function(d){
		            return d;
		        });

6.畫座標軸

                        var axis = d3.svg.axis()
				.scale(linear)      //指定比例尺
				.orient("bottom")   //指定刻度的方向
				.ticks(5);          //指定刻度的數量
					     
			var axis2 = d3.svg.axis()
				.scale(linear2)      //指定比例尺
				.orient("left")   //指定刻度的方向
				.ticks(5);      //指定刻度的數量
			
       
			svg.append("g")
   				.attr("class","axis")
				.attr("transform","translate(24,135)") //設定x軸的位置
				.call(axis);  //為當前選擇呼叫一個函式。
				
			svg.append("g")
   				.attr("class","axis")
				.attr("transform","translate(24,10)")  //設定y軸的位置
				.call(axis2);
				

        (1)這裡需要用的css樣式為

                        .axis path,
			.axis line{
			    fill: none;
			    stroke: black;
			    shape-rendering: crispEdges;
			}

7.做到上一步之後在頁面載入時,條形圖已經能動起來了,效果圖為:


8.接下來可以再為條形圖新增一些互動

                            $(document).click(function(){
				if($("svg rect").attr("width")!=="0"){    //如果矩形寬部位0的話,執行下面語句
					
					svg.selectAll(".rect")
					.transition()  //開啟過渡動畫
					.duration(1000)
					.delay(function(d,i){ 
					    return 200*i;
					})
					.attr("width","0"); //寬度變為0
					
					
					svg.selectAll(".MyText")//新增文字
				        .transition()
						.duration(1000)
						.delay(function(d,i){
						    return 200*i;
						})
						.style("opacity","0");  //文字變透明
				}else{
					svg.selectAll(".rect")
					.transition()
					.duration(1000)
					.delay(function(d,i){
					    return 200*i;
					})
					.attr("width",function(d){
						return linear(d);
					});
					
					
					svg.selectAll(".MyText")//新增文字
				        .transition()
						.duration(1000)
						.delay(function(d,i){
						    return 200*i;
						})
				        .style("opacity","1");
				}
			});

9.新增上面這段程式碼之後,點選頁面,矩形條收縮,再次點選,矩形條展開

全部程式碼如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script src="http://d3js.org/d3.v3.min.js"></script>
		<script type="text/javascript" src="js/jquery.min.js" ></script>
		<style>
			body{
				padding: 0;
				margin: 0;
			}
			.first{
				width: 80%;
				height: 800px;
				margin: 0 auto;
			}
			.axis path,
			.axis line{
			    fill: none;
			    stroke: black;
			    shape-rendering: crispEdges;
			}
			
			.axis text {
			    font-family: sans-serif;
			    font-size: 11px;
			   
			}
		</style>
	</head>
	<body>
		<div class="first"></div>
		
		<script>
			//var dataset = [ 250 , 210 , 170 , 130 , 90 ];
			
			var data2 = [ 2.5,2.1,1.7,1.3,0.9 ];
			
			var rectHeight = 25;
			
			var svg=d3.select("body")
					.select(".first")
					.append("svg")
					.attr("width","50%")
					.attr("height","50%")
					.style("padding","20px");
					

			var linear = d3.scale.linear()//矩形條比例尺
						.domain([0,d3.max(data2)]) //定義域
						.range([0,250]);  //值域
						
			var linear2 = d3.scale.linear()//座標軸比例尺
						.domain([0,5]) //定義域
						.range([125,0]);  //值域
			
			svg.selectAll(".rect")//新增rect矩形元素
				.data(data2)
				.enter()
				.append("rect")
				.attr("class","rect")
				.attr("width","0")
				.attr("height","20")
				.attr("x",rectHeight)
				.attr("y",function(d,i){
					return i*rectHeight;
				})
				.transition()//開啟過渡效果
				.duration(1000)
				.delay(function(d,i){
				    return 200*i;
				})
				.attr("x",rectHeight)
				.attr("y",function(d,i){
					return i*rectHeight;
				})
				.attr("width",function(d){
					return linear(d);
				})
				.attr("fill","rgb(0,255,255)")
				.attr("height",rectHeight-5);
				
				
			var texts = svg.selectAll(".MyText")//新增文字
		        .data(data2)
		        .enter()
		        .append("text")
		        .attr("class","MyText")
		        .transition()
				.duration(1000)
				.delay(function(d,i){
				    return 200*i;
				})
		        .attr("x", function(d,i){
		            return linear(d)-20;
		        } )
		        .attr("y",function(d,i){
		            return i*rectHeight;
		        })
		        .attr("dx",20)
		        .attr("dy",18)
		        .text(function(d){
		            return d;
		        });


			$(document).click(function(){
				if($("svg rect").attr("width")!=="0"){
					
					svg.selectAll(".rect")
					.transition()
					.duration(1000)
					.delay(function(d,i){
					    return 200*i;
					})
					.attr("width","0");
					
					
					svg.selectAll(".MyText")//新增文字
				        .transition()
						.duration(1000)
						.delay(function(d,i){
						    return 200*i;
						})
						.style("opacity","0");
				}else{
					svg.selectAll(".rect")
					.transition()
					.duration(1000)
					.delay(function(d,i){
					    return 200*i;
					})
					.attr("width",function(d){
						return linear(d);
					});
					
					
					svg.selectAll(".MyText")//新增文字
				        .transition()
						.duration(1000)
						.delay(function(d,i){
						    return 200*i;
						})
				        .style("opacity","1");
				}
			});
			var axis = d3.svg.axis()
					     .scale(linear)      //指定比例尺
					     .orient("bottom")   //指定刻度的方向
					     .ticks(5);          //指定刻度的數量
					     
			var axis2 = d3.svg.axis()
					     .scale(linear2)      //指定比例尺
					     .orient("left")   //指定刻度的方向
					     .ticks(5);      //指定刻度的數量
			
       
			svg.append("g")
   				.attr("class","axis")
				.attr("transform","translate(24,135)")
				.call(axis);
				
			svg.append("g")
   				.attr("class","axis")
				.attr("transform","translate(24,10)")
				.call(axis2);
				
			
		</script>
	</body>
</html>