d3.js 堆栈图

之前画过矩阵图 堆栈图是把一个矩阵分成几个层次 分别表示不同的类型的值

另外 今晚发现d3.js那个链接只能在翻墙的时候能用???

<html>
<head>
	<meta charset="utf-8">
	<title>堆栈图</title>
<style>

.axis path,
.axis line{
	fill: none;
	stroke: black;
	shape-rendering: crispEdges;
}
 
.axis text {
	font-family: sans-serif;
	font-size: 11px;
}

</style>
</head>
<body>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>  
	<script>
	var width=700;
	var height=500;
	var svg=d3.select("body")
			.append("svg")
			.attr("width",width)
			.attr("height",height)

	var dataset=[
        { name: "PC" , 
		  sales: [	{ year:2005, profit: 3000 },
					{ year:2006, profit: 1300 },
					{ year:2007, profit: 3700 },
					{ year:2008, profit: 4900 },
					{ year:2009, profit: 700 }] },
		{ name: "SmartPhone" , 
		  sales: [	{ year:2005, profit: 2000 },
					{ year:2006, profit: 4000 },
					{ year:2007, profit: 1810 },
					{ year:2008, profit: 6540 },
					{ year:2009, profit: 2820 }] },
		{ name: "Software" , 
		  sales: [	{ year:2005, profit: 1100 },
					{ year:2006, profit: 1700 },
					{ year:2007, profit: 1680 },
					{ year:2008, profit: 4000 },
					{ year:2009, profit: 4900 }] }
    ];

    // var stack=d3.layout.stack()
    // 			.values(function(d){
    // 				return d.sales;
    // 			})
    // 			.x(function(d){
    // 				return d.year;
    // 			})
    // 			.y(function(d){
    // 				return d.profit;
    // 			});
var stack = d3.layout.stack()
					.values(function(d){ return d.sales; })
					.x(function(d){ return d.year; })
					.y(function(d){ return d.profit; });

    var data=stack(dataset);

    var padding={left:50, right:100, top:30, bottom:30};
    var xRange=width-padding.left-padding.right;

    var xScale=d3.scale.ordinal()
    			.domain(data[0].sales.map(function(d){
    				return d.year;//返回年份值
    			}))
    			.rangeBands([0,xRange],0.3);

    var maxProfit=d3.max(data[data.length-1].sales,function(d){
    	return d.y0+d.y;
    });

    var yRange=height-padding.top-padding.bottom;

    var yScale=d3.scale.linear()
    			.domain([0,maxProfit])
    			.range([0,yRange]);


    var color=d3.scale.category10();

    //添加分组元素
    var groups=svg.selectAll("g")
    			.data(data)
    			.enter()
    			.append("g")
    			.style("fill",function(d,i){
    				return color(i);
    			});

   	var rects=groups.selectAll("rect")
   					.data(function(d){
   						return d.sales;
   					})
   					.enter()
   					.append("rect")
   					.attr("x",function(d){
   						return xScale(d.year);
   					})
   					.attr("y",function(d){
   						return yRange-yScale(d.y0+d.y);
   					})
   					.attr("width",function(d){
   						return xScale.rangeBand();
   					})
   					.attr("height",function(d){
   						return yScale(d.y);
   					})
   					.attr("transform","translate("+padding.left+","+padding.top+")");
   	//添加坐标轴
   	var xAxis=d3.svg.axis()
   				.scale(xScale)
   				.orient("bottom");

   	yScale.range([yRange,0]);

   	var yAxis=d3.svg.axis()
   				.scale(yScale)
   				.orient("left");


   	svg.append("g")
			.attr("class","axis")
			.attr("transform","translate(" + padding.left + "," + (height - padding.bottom) +  ")")
			.call(xAxis);

   	svg.append("g")
   		.attr("class","axis")
   		.attr("transform","translate("+padding.left+","+(height-padding.bottom-yRange)+")")
   		.call(yAxis);

   	var labHeight=50;
   	var labRadius=10;

   	var labelCircle=groups.append("circle")
   						.attr("cx",function(d){
   							return width-padding.right*0.98;
   						})
   						.attr("cy",function(d,i){
   							return padding.top*2+labHeight*i;
   						})
   						.attr("r",labRadius);

   	var labelText=groups.append("text")
   						.attr("x",function(d){
   							return width-padding.right*0.8;
   						})	
   						.attr("y",function(d,i){
   							return padding.top*2+labHeight*i;
   						})
   						.attr("dy",labRadius/2)
   						.text(function(d){
   							return d.name;
   						})

	</script>

</body>
</html>

效果图






   

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值