d3动态坐标图

代码:

<!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>

转载于:https://my.oschina.net/u/2400064/blog/739758

### 回答1: 在使用d3.js添加柱状时,我们可以通过以下步骤来添加XY轴坐标: 1. 创建画布:首先,我们需要创建一个SVG画布,并设定合适的宽度和高度,以容纳我们的柱状坐标轴。 2. 设定比例尺:根据数据的范围,我们需要设定一个比例尺来将数据映射到坐标轴上。比例尺可以是线性比例尺(d3.scaleLinear())或者是序数比例尺(d3.scaleOrdinal())。根据需要设定x轴和y轴的比例尺。 3. 创建坐标轴:使用d3.axis()函数创建一个坐标轴生成器,并通过指定比例尺和方向来定制坐标轴的样式和刻度。 4. 渲染坐标轴:将坐标轴生成器应用到x和y轴上,并通过translate()函数设置坐标轴的位置。例如,通过将x轴定位在底部,y轴定位在左边。 5. 创建柱状:使用绑定数据的方式,通过SVG的矩形元素或g元素创建柱状。可以根据数据的值来设定柱状的宽度、高度和位置。 6. 添加动画效果(可选):通过使用d3的过渡函数(transition)和延迟函数(delay),可以为柱状添加动画效果,使其显示变得平滑。 7. 标记坐标轴刻度(可选):可以使用d3的tickFormat函数来设定坐标轴上刻度的显示格式,如千位分隔符等。 通过以上步骤,我们就可以用d3.js添加柱状并添加XY轴的坐标了。具体实现的代码可以参考d3.js的官方文档或相关教程。 ### 回答2: 在使用d3.js创建柱状时,我们需要添加x和y轴坐标来帮助展示数据的分布和比较。下面是添加xy轴坐标的步骤: 1. 创建一个svg元素来容纳整个表。可以使用d3.select方法选择一个div元素,并通过append方法添加一个svg元素。 2. 设置svg元素的宽度和高度,以及padding值,以便给轴线留出足够的空间。 3. 创建一个x轴比例尺。根据柱状的数据范围和svg的宽度,使用d3.scaleLinear方法创建一个线性比例尺。 4. 创建一个y轴比例尺。根据柱状的数据范围和svg的高度,使用d3.scaleLinear方法创建一个线性比例尺。 5. 创建一个x轴生成器。使用d3.axisBottom方法创建一个x轴生成器,并传入之前创建的x比例尺。 6. 创建一个y轴生成器。使用d3.axisLeft方法创建一个y轴生成器,并传入之前创建的y比例尺。 7. 将x轴生成器应用到svg元素上的一个g元素上,并通过transform属性将其放置在适当的位置。 8. 将y轴生成器应用到svg元素上的一个g元素上,并通过transform属性将其放置在适当的位置。 9. 如果需要,可以对x轴和y轴进行一些样式设置,比如设置轴线颜色、刻度颜色、文本颜色等。 10. 最后,将柱状绘制到svg元素上。可以使用d3.select方法选择之前创建的g元素,并通过data和enter方法添加rect元素来表示柱子。可以根据x和y比例尺的返回值来设置每个柱子的位置和高度。 以上就是使用d3.js添加xy轴坐标的基本步骤。根据实际需求和个性化要求,你可以对以上步骤进行进一步的扩展和样式设置。 ### 回答3: 要在d3js中添加柱状并添加坐标轴,首先需要以下步骤: 1. 创建SVG元素:使用d3.select选择一个HTML元素,然后添加一个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 + ")"); 2. 创建坐标轴比例尺:使用d3.scaleBand()创建x轴比例尺,使用d3.scaleLinear()创建y轴比例尺。然后设置其域和范围。例如: var x = d3.scaleBand() .range([0, width]) .domain(data.map(function(d) { return d.x; })); var y = d3.scaleLinear() .range([height, 0]) .domain([0, d3.max(data, function(d) { return d.y; })]); 3. 添加柱状:使用d3.selectAll选择所有柱子的元素,然后使用data()方法将数据绑定到这些元素上。然后使用enter()方法进入上次缺失的元素,并使用append()方法添加矩形元素作为柱子。例如: svg.selectAll(".bar") .data(data) .enter() .append("rect") .attr("class", "bar") .attr("x", function(d) { return x(d.x); }) .attr("y", function(d) { return y(d.y); }) .attr("width", x.bandwidth()) .attr("height", function(d) { return height - y(d.y); }); 4. 添加坐标轴:使用d3.axisBottom()创建x轴,使用d3.axisLeft()创建y轴。然后使用call()方法将坐标轴添加到SVG元素中。例如: svg.append("g") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x)); svg.append("g") .call(d3.axisLeft(y)); 以上就是在d3js中添加柱状并添加坐标轴的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值