d3.js之多组柱状图

参考博客

有什么不知道的API可以参考D3中文API

也可以去查看别人写的普通柱状图柱状图详解

之前学习d3的时候就看到柱状图中有那种几组几组在一起,今天看到一个demo就是这种几组一起的。

就去仔细看了那个Demo,并且写下这篇文章。

这是V3版本

思路:平时写的写的柱状图都是一个一个,那么怎么将一个柱状图中一个分成好几个呢。

大概的思路就是这样的,其实他写了四个柱状图来将他拼凑在一起,这四个柱状图对应相同的下标的rect放在一起。

var n = 20, // number of samples
		m = 4; // number of series
var data=d3.range(m).map(function(){
			return d3.range(n).map(Math.random);
		})

首先来生成数据,range(m)生成一个长度为4的数组,然后map遍历并且返回一个数组。

然后看return里面:d3.range(n).map(Math.random):这是返回一个长度n的数组并且数值是0-1之间的随机数。

		var y = d3.scale.linear()
			.domain([0, 1])
			.range([height, 0]);

		var x0 = d3.scale.ordinal()
			.domain(d3.range(n))
			.rangeBands([0,width],.2);

		var x1=d3.scale.ordinal()
			.domain(d3.range(m))
			.rangeBands([0,x0.rangeBand()]);

上面总共设置三个比例尺:一个线性两个序数比例尺

y是用来给y轴的,他的domain范围正好对应上面随机生成的0-1之间随机数。根据这个来获取对应高度


x0 比例尺他的范围d3.range(n),既n长度的数组,这就相当于坐标尺分成了N份。

x0.rangeBand()表示的是x0比例尺的区间宽度。每一个元素在值域上面间隔。既1份的宽度

x1比例尺他的范围是d3.range(m),对应的范围是x0的rangeBand(),现在又将这1份的宽度分为m份。既在一份的宽度上面显示多个rect;


<!DOCTYPE html>
<html>
<head>
	<title>Grouped Bar Chart</title>
	<script type="text/javascript" src='../../js/d3.js'></script>

	<style type="text/css">
		.axis text {
		  font: 10px sans-serif;
		}
		.axis path,
		.axis line {
		  fill: none;
		  stroke: #000;
		  shape-rendering: crispEdges;
		}
		/*将x轴的坐标的横线隐藏*/
		.x.axis path {
		  display: none;
		}
	</style>
</head>
<body>
	

	<script type="text/javascript">
		
		var n = 20, // number of samples
			m = 4; // number of series

		//range返回m大小的数组 
		//map遍历数组并且返回数组
		//生成一个二维数组,即4个长度为20的一维数组
		var data=d3.range(m).map(function(){
			return d3.range(n).map(Math.random);
		})
		console.log(data);
		//设置svg变量和宽高
		var margin = {
				top: 20,
				right: 30,
				bottom: 30,
				left: 40
			},
			width = 960 - margin.left - margin.right,
			height = 500 - margin.top - margin.bottom;

		//设置y轴的比例尺
		var y = d3.scale.linear()
			.domain([0, 1])
			.range([height, 0]);

		//设置X轴的比例尺
		var x0 = d3.scale.ordinal()
			.domain(d3.range(n))
			.rangeBands([0,width],.2);

		console.log(x0.rangeBand());//上面每一个区间间隔的长度

		//设置一个比例尺来求得四个小rect在一个区间的占的长度
		var x1=d3.scale.ordinal()
			.domain(d3.range(m))
			.rangeBands([0,x0.rangeBand()]);
		//设置颜色的比例尺
		var z=d3.scale.category10();

		//x轴的比例尺
		var xAxis=d3.svg.axis()
			.scale(x0)
			.orient('bottom');
		//y轴比例尺
		var yAxis=d3.svg.axis()
			.scale(y)
			.orient('left');

		//添加svg并且设置宽高并且添加一个g和偏移
		var svg=d3.select('body').append('svg')
			.attr('width',width+margin.left+margin.right)
			.attr('height',height+margin.top+margin.bottom)
			.append('svg:g')
			.attr("transform","translate("+margin.left+","+margin.top+")");
		
		//添加一个y轴的分组标签
		svg.append("g")
			.attr("class", "y axis")
			.call(yAxis);
		//
		//添加一个x周到分组标签
		svg.append("g")
			.attr("class", "x axis")
			.attr("transform", "translate(0," + height + ")")
			.call(xAxis);


		svg.append('g')								//添加一个分组g标签
			.selectAll('g')							//选择所有g元素
			.data(data)								//绑定数据	即二维数组中的个数4
			.enter()								//添加数据的标志
			.append('g')							//添加g元素,也就是数据绑定元素
			.style('fill',function(d,i){			//4个元素添加不同颜色。
				return z(i);
			})
			.attr('transform',function(d,i){		//然后移动g标签	
				// console.log(i);
				return "translate("+x1(i)+",0)" ;	//x1比例尺的范围是x0的rangeband即一个的区间范围
			})
			.selectAll('rect')						//选择所有的rect,下面将要在每一个g标签里面开始添加20个rect
			.data(function(d){
				return d;						//这里面的每一个d都是一个长度为20的一维数组。
			})					
			.enter()							//根据数据开始添加rect
			.append('rect')				
			.attr('width',x1.rangeBand())		//设置x1的rangBand()宽度。
			.attr('height',function(d,i){return y(d);})					//设置rect高度 
			.attr('x',function(d,i){return x0(i);})	//设置rect的x坐标。
			.attr('y',function(d){
				return height-y(d);			//设置y的所在位置
			})
	</script>
</body>
</html>



 你手头有一些数据,想做成漂亮的图表放到网站上?好主意,通过浏览器来跨平台实现数据可视化是正确的选择。什么,你还想让图表能够响应用户操作?没问题,交互式图表比静态图片更能吸引人去探究本源。好啦,要生成通过浏览器展示的动态图表,目前热门的Web数据可视化库——D3。   《图灵程序设计丛书·数据可视化实战:使用D3设计交互式图表》这本书很有意思,而且对读者要求不高。不需要知道什么是数据可视化,也不用有太多Web开发背景就能看懂它。不信?翻一翻就知道这是一本既好玩又实用的动手指南啦!看完这本书你会怎么样呢?   掌握必要的HTML、CSS、JavaScript和SVG基础知识;   学会基于数据在网页里生成元素和为它们设置样式的技巧;   能够生成条形图、散点图、饼图、堆叠条形图和力导向图;   使用平滑的过渡动画来展示数据的变化;   赋予图表动态交互能力,响应用户从不同角度探索数据的请求;   收集数据和创建自定义的地图;   另外,《图灵程序设计丛书·数据可视化实战:使用D3设计交互式图表》100多个代码示例都可以在线浏览! 【电子版来自互联网,仅供预览及学习交流 使用,不可用于商业用途,如有版权问题,请联系删除,支持正版,喜欢的 请购买正版书籍: https://e.jd.com/30336473.html】
好的,下面是使用d3.js生成一个简单的柱状图的示例代码: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>D3.js柱状图</title> <script src="https://d3js.org/d3.v6.min.js"></script> <style> .bar { fill: steelblue; } </style> </head> <body> <script> // 数据集 var dataset = [5, 10, 13, 19, 21, 25, 22, 18, 15, 13, 11, 12]; // 定义画布大小及边距 var margin = { top: 30, right: 30, bottom: 30, left: 30 }; var width = 600 - margin.left - margin.right; var height = 400 - margin.top - margin.bottom; // 创建svg元素 var svg = d3.select("body") .append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); // 定义x轴比例尺 var xScale = d3.scaleBand() .domain(d3.range(dataset.length)) .rangeRound([0, width]) .paddingInner(0.1); // 定义y轴比例尺 var yScale = d3.scaleLinear() .domain([0, d3.max(dataset)]) .range([height, 0]); // 添加矩形 svg.selectAll(".bar") .data(dataset) .enter() .append("rect") .attr("class", "bar") .attr("x", function(d, i) { return xScale(i); }) .attr("y", function(d) { return yScale(d); }) .attr("width", xScale.bandwidth()) .attr("height", function(d) { return height - yScale(d); }); // 添加x轴 svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(xScale)); // 添加y轴 svg.append("g") .attr("class", "y axis") .call(d3.axisLeft(yScale)); </script> </body> </html> ``` 在这个示例代码中,我们使用了d3.js的选择集、比例尺、坐标轴等功能来生成一个简单的柱状图。具体实现过程可以参考代码注释。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值