D3js-堆栈图

效果图:

源代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>D3 -堆栈图</title>
	<style type="text/css">
	.axis path,
	.axis line{
	fill: none;
	stroke: black;
	 shape-rendering: crispEdges;

}
.axis text {
	font-family: sans-serif;
	font-size: 14px;
	font-weight: bold;
}
	</style>
  </head>

  <body>
  	<script type="text/javascript" src="js/d3/d3.js"></script>
	<script type="text/javascript" src="js/d3/d3.min.js"></script>
   <script type="text/javascript">

   		var width = 750;
   		var height = 500;
   		var padding ={left:80 ,top:50,right:100,bottom:30};

   		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 },
									{ year:2010, 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 },
									{ year:2010, profit: 1000 }] },
						{ name: "Software" ,
						  sales: [	{ year:2005, profit: 1100 },
									{ year:2006, profit: 1700 },
									{ year:2007, profit: 1680 },
									{ year:2008, profit: 4000 },
									{ year:2009, profit: 4900 },
									{ year:2010, profit: 700 }] }
					 ];

   			//layout转换数据,转换成适合堆栈图的数据
   			var stack = d3.layout.stack()
   								.values(function(d){//获取或设置每个系列值的访问器函数
   									return d.sales;
   								})
   								.x(function(d){//获取或设置x轴访问器函数
   									return d.year;
   								})
   								.y(function(d)//获取或设置y轴访问器函数
   								{
   									return d.profit;
   								});
   			var data =stack(dataset);

   			console.log(data);//输出数据,可以查看到y0和y

   		//x轴比例尺
   			var xRange = width-padding.left-padding.right;
   			//序列比例尺 (设置x轴上每个节点(年份)所显示的位置)
   			var xScale =d3.scale.ordinal()
   						  .domain(data[0].sales.map(function(d){ //设置比例尺的定义域  (在x轴要显示的数据)
   						  	return d.year;
   						  }))
   						  .rangeBands([0,xRange],0.3);//为离散的块划分值域,(设置图表适合页面的宽度,显示位置)	

   		//Y轴比例尺
			//获得定义域最大值  (data[data.length-1]是最上面那个矩形,位于最高层,所以他的sales中的y0+y是最大的)
			var bigProfit = d3.max(data[data.length-1].sales,function(d)
			{
				return d.y+d.y0; //y0即该层起始坐标,y是高度
			});
			//获得值域最大值
			var yRange =height-padding.top-padding.bottom;
   			//线性比例尺
   			var yScale = d3.scale.linear()
   							.domain([0,bigProfit])   //定义域
   							.range([0,yRange]); //值域

   		//颜色比例尺
   		var color = d3.scale.category20();

 		//添加分组g标签 并设置颜色
 		var groupRect = svg.selectAll("g")
 							.data(data)
 							.enter()
 							.append("g")
 							.attr("fill",function(d,i)
 							{
 								return color(i);
 							});

 		//添加矩形
 		var rects = groupRect.selectAll("rect")
 							.data(function(d)
 							{
 								return d.sales;
 							})
 							.enter()
 							.append("rect")
 							.attr("x",function(d,i){
 								return xScale(d.year); //x轴上坐标的位置
 							})
 							.attr("y",function(d,i){
 								return yRange-(yScale(d.y0+d.y));//Y轴上坐标的高度
 							})
 							.attr("width",function(d,i)
 							{
 								return xScale.rangeBand(); //rangeBand()取得离散块的宽度,即x轴上各个矩形的宽度
 							})
 							.attr("height",function(d,i)
 							{
 								return yScale(d.y); //y为矩形的高度
 							})
 							 //堆栈图偏移位置,即具体页面左边和顶部的位置
 							.attr("transform","translate("+padding.left+","+padding.top+")"); 

 		//添加 x轴
 		var xAxis = d3.svg.axis()
 						.scale(xScale)//取得比例尺
 						.orient("bottom");//设置显示的方位

 		svg.append("g")
 			.attr("class","axis")
 			.attr("transform",function(d,i) //坐标位置
 			{
 				return "translate("+padding.left+","+(height-padding.bottom)+")";
 			})
 			.call(xAxis)
 			//x轴坐标说明
 			.append("text")
 			.attr("x",function(d)
 			{
 				return width-padding.left-padding.right;
 			})
 			.text("year");

 		//添加y轴
 		yScale.range([yRange,0]); //y轴上数据是从上到下递减

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

 		svg.append("g")
 			.attr("class","axis")
 			.attr("transform",function(d,i) //坐标位置
 			{
 				return "translate("+padding.left+","+(height-padding.bottom-yRange)+")";
 			})
 			.call(yAxis)
 			//y轴坐标说明
 			.append("text")
 			.text("profit")
 			.attr("x",function(d)
 			{
 				return -20;
 			});

 		//分组标签
 		var labHeight=50;
 		var labRadius=10;
 		//圆形标识
 		var labelCircle = groupRect.append("circle")
 									.attr("cx",function(d)
 									{
 										return width-padding.right*0.98;
 									})
 									.attr("cy",function(d,i)
 									{
 										return padding.top*2+labHeight*i*0.5;
 									})
 									.attr("r",labRadius);
 		//文本文字
 		var labelText = groupRect.append("text")
 								.attr("x",function(d)
 								{
 									return width-padding.right*0.8;
 								})
								.attr("y",function(d,i)
								{
									return padding.top*2+labHeight*i*0.5;
								})
								//dy使 文字显示和圆形的圆心在同一行
								 .attr("dy",function(d)
								{
									return labRadius/2;
								})
								.text(function(d)
								{
									return d.name;
								});
   </script>

  </body>
</html>

其中y和y0的介绍:y表示矩形(柱状体)的高度,y0表示这个柱状体的起始高度(即这个矩形从哪里开始绘制)

解释一下上图:(以绘制的第一排柱状体为例)

绘制出来是下面这个效果

第一个矩形(最下面那个蓝色矩形)起始位置y0是0,它的高度y(也就是数据中profit的值)是3000;中间那个矩形它在第一个矩形上面所以它的起始高度y0是3000,而它的高度y是2000;最上面那层矩形它的起始高度是下面两个矩形的高度和就是5000,它的高度y是1100。这就是y和y0所表示的意思。

来源网站:http://www.ourd3js.com/wordpress/?p=1007

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-19 06:23:31

D3js-堆栈图的相关文章

Echarts-echart和springMVC实现堆栈图

效果图: 通过工具栏切换成折线图: 1.部署好springMVCproject 2.*****在lib中增加ECharts-2.2.4.jar   下载地址:http://git.oschina.net/free/ECharts 3.由于要用到fastJson所以还要导入其所需的jar包fastjson-1.2.5-sources.jar 和fastjson-1.2.5.jar 4.springMVC的服务层的代码:EchartsT.java package com.service; impor

【 D3.js 高级系列 — 3.0 】 堆栈图

堆栈图布局(Stack Layout)能够计算二维数组每一数据层的基线,以方便将各数据层叠加起来.本文讲解堆栈图的制作方法. 先说说什么是堆栈图. 例如,有如下情况: 某公司,销售三种产品:个人电脑.智能手机.软件. 2005年,三种产品的利润分别为3000.2000.1100万. 2006年,三种产品的利润分别为1300.4000.1700万. 计算可得,2005年总利润为6100万,2006年为7000万. 如果要将2005年的利润用柱形表示,那么应该画三个矩形,三个矩形堆叠在一起.这时候就

Echarts-echart和springMVC实现堆栈图(读取JSON文件数据)

这篇echarts的堆栈图主要是根据这篇D3.js堆栈图(http://blog.csdn.net/u013147600/article/details/46770415 )实现的. 效果图: 1.JSON文件数据: { "name":"某市2005-1010年利润情况", "product": [ { "name": "PC" , "sales": [ { "year&quo

【逆向知识】堆栈图-汇编中的函数

push ebp ; 提升堆栈 mov ebp,esp sub esp,0CCh ------------------------------------------ push ebx ; 保留现场,函数在执行的时候会用到一些寄存器,但这些寄存器中 push esi ; 值很可能会被程序用到,所以要先存储到内存中 push edi push ecx ------------------------------------------ lea edi,[ebp-0CCh] ; 向分配的空间填充数据

堆栈图

CALL和JMP的区别 CALL会把调用处的下一个指令的地址压栈,而JMP不会 函数的调用过程 //funciton add(a,b){return a+b}?push第一个参数入栈push第二个参数入栈?call调用的返回地址压栈?跳转准备?push ebp //保存当前栈底?mov ebp,esp //提升栈底,此时ebp所在的内存单元保存了原来的栈底地址?sub esp,40h //建立缓冲区?push ebx //保存当前执行环境?push esi //保存当前执行环境?push edi

C/C++堆栈指引

[转载]C/C++堆栈指引 转载:http://www.cnblogs.com/Binhua-Liu/archive/2010/08/24/1803095.html 前言 我们经常会讨论这样的问题:什么时候数据存储在堆栈(Stack)中,什么时候数据存储在堆(Heap)中.我们知道,局部变量是存储在堆栈中的:debug时,查看堆栈可以知道函数的调用顺序:函数调用时传递参数,事实上是把参数压入堆栈,听起来,堆栈象一个大杂烩.那么,堆栈(Stack)到底是如何工作的呢? 本文将详解C/C++堆栈的工

VS2015--在 Visual Studio 中调试时映射调用堆栈上的方法

https://msdn.microsoft.com/zh-cn/library/dn194476.aspx 在 Visual Studio 中调试时映射调用堆栈上的方法 创建代码图,以便在调试时对调用堆栈进行可视化跟踪.你可以在图中进行标注以跟踪代码执行的操作,以便专注于查找 Bug. 生成调用堆栈图 1 开始调试.(键盘:"F5") 2 在你的应用进入中断模式或你单步执行某一函数之后,请选择"代码图".(键盘:Ctrl + Shift + `) 当前的调用堆栈在

java中的堆栈

数据存放在哪里? 栈中存放的数据:基本类型数据.对象引用的句柄(指向对象的地址) 堆中存放的数据:创建的对象 静态方法区存放的数据:字面量 例如: String str = new String( "hello" ); 上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而"hello"这个字面量放在静态区. 数据类型的分类 基本类型 基本类型是比对象更小的单位,不是new出来的,有byte .chart .short .int .long .fl

AndroidManifest详解之Application(有图更好懂)

能够包含的标签: <activity> <activity-alias> <service> <receiver> <provider> <uses-library> 常用的属性: android:process 默认情况下,Android为每个应用程序创建一个单独的进程,所有组件运行在该进程中,这个默认进程的名字通常与该应用程序的包名相同.比如 <manifest xmlns:android="http://sche

浅谈C/C++堆栈指引——C/C++堆栈

C/C++堆栈指引 Binhua Liu 前言 我们经常会讨论这样的问题:什么时候数据存储在飞鸽传书堆栈(Stack)中,什么时候数据存储在堆(Heap)中.我们知道,局部变量是存储在堆栈中的:debug时,查看堆栈可以知道函数的调用顺序:函数调用时传递参数,事实上是把参数压入堆栈,听起来,堆栈象一个大杂烩.那么,堆栈(Stack)到底是如何工作的呢? 本文将详解C/C++堆栈的工作机制.阅读时请注意以下几点: 1)本文讨论的语言是 Visual C/C++,由于高级语言的堆栈工作机制大致相同,