当前访客身份:游客 [ 登录  | 注册加入尚学堂]
直播

easychart

拥有积分:4
这家伙太懒,还没有签名!

博客分类

笔记中心

课题中心

提问中心

答题中心

解答题中心

D3.JS 基于javascript的图表展示库<五>-基本柱状图1

easychart 发表于 2年前 (2014-10-16 23:40:51)  |  评论(0)  |  阅读次数(670)| 0 人收藏此文章,   我要收藏   

柱状图可以说是基本的数据展示方式之一。本节 代码在 http://download.csdn.net/detail/a6383277/5224447

这里简单介绍一下。采用的代码来自http://mbostock.github.com/d3/tutorial/bar-1.html 如果不明白可以自己查看更详细说明,也可以先看官方的说明在来看注释


先介绍两个方法

1.  selector.attr(key,value)   用来设置选中元素的属性,如:d3.select("div#a1").attr("class","char") 设置div的样式为char.

2. selectot.style(key,value) 设置选中元素的样式,如:d3.select("div#a1").style("width","12px")  设置div的宽度为12px

3.d3.scale.linear  创建一个线性量化尺度。你可以先理解成类似地图上的比例尺。

官网上是这样说的

Constructs a new linear scale with the default domain [0,1] and the default range [0,1]. Thus, the default linear scale is equivalent to the identity function for numbers; for example linear(0.5) returns 0.5.创建一个0-1的默认值域和0-1的默认值范围。这个刻度尺相当于一个函数,计算传入的值,按比例算出值。举个例子说是这样的。如果默认值范围是0~1那么传一个0.5进去那么计算后的值也是0.5。如果域范围0-400,值范围是0-200,数值50计算就是 50/400=x/200  x为25了。我解释的可能有点不正确。等下看代码就清楚了。 请先记住一点,d3.scale.linear是个函数,数学函数。

linear可以使用函数domain ,range来分别设置值域和值范围。

4.d3.max(Array)获取数组中的最大值

5.d3.min(Array)获取数组中的最小值

6.d3.extent(Array)获取数组中的最大值和最小值,相当于d3.extent(Array) == [d3.min(Array),d3.max(Array)]

二 

 Demo

index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Seletor</title>
<script type="text/javascript" src="lib/d3.v3.js"></script>
<style>
.chart div {
  font: 10px sans-serif;
  background-color: steelblue;
  text-align: right;
  padding: 3px;
  margin: 1px;
  color: white;
}
</style>
<script type="text/javascript">
	function charbar(){
		var data = [4, 8, 15, 16, 23, 42];
		var chart = d3.select("body").append("div")
						.attr("class", "chart"); //在body下添加一个div  "chart"并设置其样式为chart
		chart.selectAll("div") //在已添加的div "chart"下选择所有的div
			.data(data) //绑定数据
			.enter().append("div") //根据数据增加div
			.style("width", function(d) { return d * 10 + "px"; }) //设置div的宽度为 data[i]*10个像素
			.text(function(d) { return d; }); //设置div的内容 相当于.text(String);
	}
	window.onload = charbar;
</script>
</head>
<body>	

</body>
</html>

上面的Demo展示出来的图形有点局限性。因为是直接根据数据自身的长度来设置。但大多数情况下,关于统计图所在html占据的长宽一般是固定,这样才利于排版。所以d3在这方面采用了类似权重计算的方式来计算每个数据的图形大小。

Demo2  linear函数的使用 index02.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Seletor</title>
<script type="text/javascript" src="lib/d3.v3.js"></script>
<style>
</style>
<script type="text/javascript">
	function line(){		
		var x = d3.scale.linear()
		.domain([0, 400]) //设置值域
		.range([0,200]); //设置值范围
		console.log(x(50)); //打印50对应的值
	}
	window.onload = line;
</script>
</head>
<body>	

</body>
</html>

Demo3

index03.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Seletor</title>
<script type="text/javascript" src="lib/d3.v3.js"></script>
<style>
.chart div {
  font: 10px sans-serif;
  background-color: steelblue;
  text-align: right;
  padding: 3px;
  margin: 1px;
  color: white;
}
</style>
<script type="text/javascript">
	function charbar(){
		var data = [4, 8, 15, 16, 23, 42];
		var chart = d3.select("body").append("div")
						.attr("class", "chart"); //在body下添加一个div  "chart"并设置其样式为chart

		var x = d3.scale.linear()  //定义线性尺
			.domain([0, d3.max(data)]) //域范围
			.range(["0px", "420px"]); //值范围(range里面应该发生了数据类型 的转换)
			
		chart.selectAll("div")
			.data(data)
			.enter().append("div")
			.style("width", x) //对应demo1,变化部分主要就是在这里 
			//.style("width", function(d){ return (420/d3.max(data))*d + "px" }) //对应demo1,变化部分主要就是在这里 
				//前面提到过linear是一个函数,所以这里x应该相当于 function(d){ return (420/d3.max(data))*d + "px" })
			.text(String);
	}
	window.onload = charbar;
</script>
</head>
<body>	

</body>
</html>

Demo04

index04.html。

现在开始接触一下 svg了 。再次提醒一下,如果对于svg不熟悉,建议去w3chool看看svg简单教程大概花个15分钟了解一下就可以了。

demo很简单和demo1 中div的应用差不多

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Seletor</title>
<script type="text/javascript" src="lib/d3.v3.js"></script>
<style>
.chart rect {
  stroke: white;
  fill: steelblue;
}
</style>
<script type="text/javascript">
	function charbar(){
		var data = [4, 8, 15, 16, 23, 42]; 
		var chart = d3.select("body").append("svg") //在body下添加一个svg  "chart"并设置其样式为chart,然后分别设置了宽和高
			.attr("class", "chart")
			.attr("width", 420)
			.attr("height", 20 * data.length);

		var x = d3.scale.linear()
			.domain([0, d3.max(data)])
			.range([0, 420]);
			
		chart.selectAll("rect")  //选择svg下的所有长方形
			.data(data)  //绑定数据
			.enter().append("rect")//添加长方形
			.attr("y", function(d, i) { return i * 20; }) //计算矩形的左上角顶点y的坐标
			.attr("width", x)  //矩形的长度
			.attr("height", 20); //矩形的宽度
	}
	window.onload = charbar;
</script>
</head>
<body>	

</body>
</html>

最后

现在这个矩形图是横着的,但一般我们习惯于竖着,请思考一下如果把横着的改成竖着 的。这个需要找找svg的有关画图顶点位置相关的知识。


分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183