代码:
<!DOCTYPE html>
<meta charset="utf-8">
<svg width="800" height="600"></svg>
<script src="http://d3js.org/d3.v4.min.js"></script>
<script>
var datas0 = [{x:0.1,y:4},{x:0.5,y:8}],
datas1 = [{x:0.2,y:2},{x:0.8,y:6}],
datas2 = [{x:0.6,y:8},{x:1.1,y:4}],
datas3 = [{x:0.8,y:2},{x:1.3,y:1}],
datas4 = [{x:1.0,y:8},{x:1.5,y:-3}],
datas5 = [{x:1.4,y:2},{x:1.8,y:-5}],
datas6 = [{x:1.8,y:0},{x:2,y:-8}];
var color = function(index){
var arr = ["#FF0000","#FFFF00","#00FF00","#0000FF","#00FFFF","#FF00FF","#276419",];
return arr[index%arr.length];
}
var bigArr = [{"data":datas1},{"data":datas2},{"data":datas3},{"data":datas4},{"data":datas5},{"data":datas6}];
var textData = [],
days = 12, //getLastDay(2017,2); //参数:<年,d月>
yLength = 20,
xLength = 2,
step = yLength*(1/days+1)/days;
for(var i =0;i<days;i++){
textData.push({x:2,y:(yLength/2-step*i)});
}
var svg = d3.select("svg"),
margin = {top: 40, left: 40, bottom: 100, right: 100},
width = +svg.attr("width") - margin.left - margin.right,
height = +svg.attr("height") - margin.top - margin.bottom;
var xScale = d3.scaleLinear().domain([0,xLength]).range([0,width- margin.left-margin.right]);
var yScale = d3.scaleLinear().domain([-yLength/2, yLength/2]).range([height-margin.top-margin.bottom, 0]);
var line = d3.line()
.x(function(d){return d.x;})
.y(function(d){return yScale(d.y);})
;
var g = svg.append('g').attr("transform","translate("+margin.left+","+margin.top+")");
var leftCirle =g.append("g").selectAll("circle").data(datas0).enter().append("circle")
.attr("transform",function(d){
return "translate("+xScale(d.x)+","+yScale(d.y)+")";
})
.attr("r",10)
.attr("opacity","0.6")
.attr("fill",function(d,i){ return color(i); })
.attr("cx",function(d){ return d.x;})
.attr("cy",function(d){ return d.y;});
var lineData = textData.length <=1 ? [textData[0]] : [textData[0],textData[textData.length-1],];
var rightLine = g.append('g').append('path')
.attr('d',line(lineData) )
.attr("transform",function(d){ return "translate("+(xScale(xLength*1.15))+",0)"; })
.attr('stroke', "#000")
.attr('stroke-width', "2")
;
var rightCicleG = g.append('g').attr("transform",function(d){ return "translate("+(xScale(xLength*1.15))+",0)"; });
var rightCircle = rightCicleG.append('circle').datum(textData[0])
.attr('cx',textData[0].x)
.attr('cy',yScale(textData[0].y))
.attr('r', 10)
.attr('fill', '#999999')
;
//添加线右边的日期
rightCicleG.selectAll("text").data(textData).enter().append('text').attr("transform", "translate(10,5)")
.attr('x',function(d){return d.x; })
.attr('y',function(d){return yScale(d.y);})
.attr("cursor",'pointer')
.text(function(d,i){ return "2016年"+(1+i)+"月"; })
.on("click",toggleMorT);
//创建x轴
g.append("g").attr("class","axis axis--x").attr("transform","translate(0,"+yScale(0)+")")
.call(d3.axisBottom(xScale).tickSize(-6).ticks(10).tickFormat(function(d,i){return i%2==0?'':d.toFixed(1);}))
.selectAll(".tick text").attr("dy","1.3em");
//添加x轴名称
g.selectAll(".axis--x")
.append('text')
.attr("transform","translate("+xScale(xLength*1.03)+","+yScale(yLength/2*0.9)+")")
.attr("fill","#000")
.attr("font-size","12px")
.text("XXX")
;
//创建y轴
g.append("g").attr("class","axis axis--y")
.call(d3.axisLeft(yScale).tickSize(-6))
.append('text')
.attr("transform","translate(20,-20)")
.attr("fill","#000")
.attr("font-size","12px")
.text("XXX(%)");
//yAxis.tickSizeOuter(6);
//获取当月最后一天
function getLastDay(year,month){
var day = new Date(parseInt(year),parseInt(month),0);
return day.getDate();
}
console.log(getLastDay(2017,2));
//控制圆圈移动与停止
var isStop = false;
function toggleMorT(){
if(!isStop) {
isStop = true;
In.stop();
}else {
if(j>=textData.length) return;
isStop = false;
In = d3.interval(move,1500);
}
}
//移动右边的圆
function moveRightCircle(){
leftCirle.transition().duration(1000).on("start",slide);
}
var t=-1,
obj;
function slide(d,i){
if(i==0) t++;
if(t>=len) return;
obj= bigArr[t].data;
d3.active(this)
.attr("transform",function(){
return "translate("+xScale(obj[i].x)+","+yScale(obj[i].y)+")";
})
.attr("cx",obj[i].x).attr("cy",obj[i].y);
}
//移动左边的圆
function moveLeftCircle(y){
rightCircle.transition().duration(1000).attr("cy",y);
}
var j = 1,
len = bigArr.length;
function move(){
if(j<=len) moveRightCircle();
var y = textData[j].y;
moveLeftCircle(yScale(y));
j++
if(j>=textData.length) In.stop();
}
//定时任务:启动动画
var In = d3.interval(move,1500);
</script>