d3v4制作各种线形图并利用按钮切换类型

d3v4制作各种线形图并利用按钮切换类型

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>d3线形图</title>
    <!--script src="https://d3js.org/d3.v4.min.js"></script-->
    <script src="d3.v4.js"></script>

</head>
<body>

<h4>Curve Mode</h4>
<button id='Linear'>Linear</button>
<button id='LinearClosed'>Linear Closed</button>
<button id='StepBefore'>Step Before</button>
<button id='StepAfter'>Step After</button>
<button id='Basis'>Basis</button>
<button id='BasisOpen'>Basis Open</button>
<button id='Cardinal' onclick='render(d3.curveCardinal.tension(0.4))'>Cardinal</button>
//tension 0-1 线的张力改变
<br/>
<br/>


<script type="text/javascript">

var w=600,h=400,margin=30

var svg=d3.select("body")
        .append("svg")
        .attr("width",w)
        .attr("height",h)
        .style("background-color","lavender")

// var data=[[[0,80],[100,100],[200,30],[300,50],[400,40],[500,80]],[]]
var data=[[{x:0,y:5},{x:1,y:9},{x:2,y:7},{x:3,y:5},{x:4,y:3},{x:6,y:4},{x:7,y:2},{x:8,y:3},{x:9,y:2}],
			d3.range(10).map(
				function(i){
					return {x:i,y:Math.sin(i)+5}
				}	
			)//构造坐标
]
//xy比例尺,映射坐标
var xScale=d3.scaleLinear()
			.domain([0,10])
			.range([margin,w-margin])
var yScale=d3.scaleLinear()
			.domain([0,10])
			.range([h-margin,margin])

//定义xaxis yaxis 
var xAxis=d3.axisBottom()
			.scale(xScale)
			.ticks(5)
			
var yAxis=d3.axisLeft()
			.scale(yScale)
			.ticks(5)
						
render(d3.curveLinear)
function render(mode){
//定义线生成器
	var line=d3.line()
				.x(function(d,i){return xScale(d.x)})
				.y(function(d,i){return yScale(d.y)})
				.curve(mode)//线的平滑程度

	var color=d3.scaleOrdinal(d3.schemeCategory20c)		
//append path
	var lineSelection=svg.selectAll('path.line')
		.data(data)
	//enter
	lineSelection.enter()
				.append('path')
				.attr('class','line')
				.attr('d',function(d,i){return line(d)})
				.style('stroke',function(d,i){return color(i)})//线的颜色
				.style('fill','transparent')//默认填充黑色
				.style('stroke-dasharray','3,2')//线性,虚线
	//update
	lineSelection.transition()
				.delay(function(d,i){return 500/data.length*i})
				.duration(500)
				.ease(d3.easeLinear)
				.attr("class",'path')
				.attr('d',function(d,i){return line(d)})
				.style('stroke',function(d,i){return color(i)})
	//exit
	lineSelection.exit().remove
	renderDots(svg)
	renderAxis(svg)
	
	console.log(data)
	console.log(line(data[0]))
	console.log(line(data[1]))
}
//画坐标轴
function renderAxis(svg){
	
	svg.select('#axisG')
		.remove()
		
	var axisG=svg.append('g')
				.attr('id','axisG')
		
	axisG.append('g')
		.attr('transform','translate(0,'+(h-margin)+')')
		.call(xAxis)
	axisG.append('g')
		.attr('transform','translate('+margin+',0)')
		.call(yAxis)		
}
//画坐标点,数据标记点
	
function renderDots(svg){
	
	data.forEach(function(list){
		svg.append('g')
			.selectAll('circle')
			.data(list)
			.enter()
			.append('circle')
			.attr('class','dot')
			.attr('cx',function(d,i){return xScale(d.x)})
			.attr('cy',function(d,i){return yScale(d.y)})
			.attr('r',4)
			.attr('fill','white')
			.style('stroke','blue')
			
	})
}

//事件监听
d3.select('#Linear')
	.on('click',function(){
		render(d3.curveLinear)
	})
	
d3.select('#LinearClosed')
	.on('click',function(){
		render(d3.curveLinearClosed)
	})

d3.select('#StepBefore')
	.on('click',function(){
		render(d3.curveStepBefore)
	})

d3.select('#StepAfter')
	.on('click',function(){
		render(d3.curveStepAfter)
	})

d3.select('#Basis')
	.on('click',function(){
		render(d3.curveBasis)
	})

d3.select('#BasisOpen')
	.on('click',function(){
		render(d3.curveBasisOpen)
	})
	


</script>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

decadent7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值