Javascript D3.js-如何解决拖动线图时出现的NAN错误(提供了JSFIDLE)

Javascript D3.js-如何解决拖动线图时出现的NAN错误(提供了JSFIDLE),javascript,jquery,svg,d3.js,data-visualization,Javascript,Jquery,Svg,D3.js,Data Visualization,我最近开始研究D3.js。我正在开发一个具有双x轴的交互式多线图。请看一下我的作品,JSFIDLE在这里:http://jsfiddle.net/dalapati/cdkn14j3/1/ data1 = [ {"date": 1357717800000,"value": "5.6"}, {"date": 1357718400000,"value": "5.6"},

我最近开始研究D3.js。我正在开发一个具有双x轴的交互式多线图。请看一下我的作品,JSFIDLE在这里:
http://jsfiddle.net/dalapati/cdkn14j3/1/

    data1 = [
                    {"date": 1357717800000,"value": "5.6"}, 
                    {"date": 1357718400000,"value": "5.6"}, 
                    {"date": 1357719000000,"value": "6"}, 
                    {"date": 1357719600000,"value": "5.1"},
                    {"date": 1357720200000,"value": "5.3"},
                    //{"date": 1357720800000,"value": "5.4"}
                ];

    data2 = [
                    {"date": 1357714800000,"value": "5.2"},
                    {"date": 1357715400000,"value": "5.2"},
                    {"date": 1357716000000,"value": "5.2"}, 
                    {"date": 1357716600000,"value": "5.1"},
                    {"date": 1357717200000,"value": "5.5"}, 
            ]      

// date manipulation to format UTC to js Date obj           
    data1.forEach(function(d){ d.time = new Date(d.time * 1000);});
    data2.forEach(function(d){ d.time = new Date(d.time * 1000);});

// helpers and constants        
var margin = {"top": 50, "right": 50, "bottom": 50, "left": 100, "axis": 55};
var width = 1500 - margin.left - margin.right;
var height = 580 - margin.top - margin.bottom;
var timeFormat = d3.time.format("%X");

// find data range
var x1Domain = d3.extent(data1, function(d){ return d.date; });
var x2Domain = d3.extent(data2, function(d){ return d.date; });

var x1Min = d3.min(data1, function(d){ return Math.min(d.date); });
var x1Max = d3.max(data1, function(d){ return Math.max(d.date); });

var x2Min = d3.min(data2, function(d){ return Math.min(d.date); });
var x2Max = d3.max(data2, function(d){ return Math.max(d.date); });

var y1Min = d3.min(data1, function(d){ return Math.min(d.value); });
var y1Max = d3.max(data1, function(d){ return Math.max(d.value); });

var y2Min = d3.min(data2, function(d){ return Math.min(d.value); });
var y2Max = d3.max(data2, function(d){ return Math.max(d.value); });

var yMin = (y1Min < y2Min) ? y1Min:y2Min;
var yMax = (y1Max > y2Max) ? y1Max:y2Max;

// scales
var x1Scale = d3.time.scale()
                    .domain(d3.extent(data1, function (d) {
                        return d.date;}))
                    .range([0, width]);
var x2Scale = d3.time.scale()
                    .domain(d3.extent(data2, function (d) {
                        return d.date;}))
                    .range([0, width]);
var yScale = d3.scale.linear()
                    .domain([yMin,yMax]).range([height, 0]); 

// set up axes
var x1Axis = d3.svg.axis()
                    .scale(x1Scale)
                    .orient("bottom")
                    .ticks(5)
                    .tickPadding(5)
                    .tickFormat(timeFormat);
var x2Axis = d3.svg.axis()
                    .scale(x2Scale)
                    .orient("top")
                    .ticks(5)
                    .tickPadding(5)
                    .tickFormat(timeFormat);
var yAxis = d3.svg.axis()
                    .scale(yScale)
                    .orient("left")
                    .ticks(5);
var make_y_axis = function () {
                            return d3.svg.axis()
                                .scale(yScale)
                                .orient("left")
                                .ticks(5);
                        };

// Set up chart type
// create a line function that can convert data into x and y points
var line1 = d3.svg.line().interpolate("basis")
                .x(function (d) {
                    return x1Scale(d.date);
                })
                .y(function (d) {
                    return yScale(d.value);
                });
var line2 = d3.svg.line().interpolate("basis")
                .x(function (d) {
                    return x2Scale(d.date);
                })
                .y(function (d) {
                    return yScale(d.value);
                });


//   Create Zoom feature
var zoomBottom = d3.behavior.zoom()
                    .x(x1Scale)
                    //.y(yScale);
                    .scaleExtent([1,10]);
var zoom = d3.behavior.zoom()
                    .x(x2Scale)
                    //.y(yScale)
                    .scaleExtent([1,10])
                    .on("zoom",zoomed);


// Create Drag behaviour
var drag = d3.behavior.drag()
            .origin(function(d){return d;})
            .on("dragstart", dragstarted)
            .on("drag", dragged)
            .on("dragend", dragended)


// create svg container
var svg = d3.select('#chart')
                .append("svg: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 + ")")
                .call(zoom);

    svg.append("svg:rect")
                .attr("width", width)
                .attr("height", height)
                .attr("class", "plot");

function draw(){
 //Draw Axes
    svg.append("svg:g")
        .attr("class", "x axis axisBottom")
        .attr("transform", "translate(0, " + height + ")")
        .call(x1Axis);

    svg.append("svg:g")
        .attr("class", "x axis axisTop")
        .attr("transform", "translate(0, 0)")
        .call(x2Axis);

    svg.append("g")
        .attr("class", "y axis")
        .call(yAxis);

// grid plot
    svg.append("g")
        .attr("class", "y grid")
        .call(make_y_axis()
        .tickSize(-width, 0, 0)
        .tickFormat(""));

 // add lines
// do this AFTER the axes above so that the line is above the tick-lines
var clip = svg.append("svg:clipPath")
                    .attr("id", "clip")
                    .append("svg:rect")
                    .attr("x1Scale", 0)
                    .attr("x2Scale", 0)
                    .attr("yScale", 0)
                    .attr("width", width)
                    .attr("height", height);

var chartBody = svg.append("g")
        .attr("clip-path", "url(#clip)");

chartBody.append("svg:path")
        .datum(data1)
        .attr("class", "data1")
        .attr("d", line1(data1))
        .attr("cursor", "move")
        .call(drag);

    chartBody.append("svg:path")
        .datum(data2)
        .attr("class", "data2")
        .attr("d", line2(data2))
        .attr("cursor", "move")
        .call(drag);
    }  

    draw();  
/************************** ADDING ZOOMING FEATURE****************************************/

function zoomed() {
        //console.log(d3.event.translate);
        //console.log(d3.event.scale);        
        zoomBottom.scale(zoom.scale()).translate(zoom.translate());
        svg.select(".axisBottom").call(x1Axis);
        svg.select(".axisTop").call(x2Axis);
        svg.select(".y .axis").call(yAxis);
        svg.select(".grid").call(make_y_axis().tickSize(-width,0,0).tickFormat(""));
        svg.select(".data1").attr("d",line1(data1));
        svg.select(".data2").attr("d",line2(data2));
    }

/***************** Adding Dragging feature*****************************************************/

function dragstarted(d){
    d3.event.sourceEvent.stopPropagation();
    d3.select(this).classed("dragging", true);
}

function dragged(d){
    var lineToMove = d3.event.x;
    console.log(lineToMove);
    d3.select(this)
        .attr("cx", d[0] = d3.event.sourceEvent.x);
}

function dragended(d){
    d3.select(this).classed("dragging", false);
}
data1=[
{“日期”:1357717800000,“价值”:“5.6”},
{“日期”:1357718400000,“价值”:“5.6”},
{“日期”:1357719000000,“价值”:“6”},
{“日期”:1357719600000,“价值”:“5.1”},
{“日期”:1357720200000,“价值”:“5.3”},
//{“日期”:1357720800000,“价值”:“5.4”}
];
数据2=[
{“日期”:1357714800000,“价值”:“5.2”},
{“日期”:1357715400000,“价值”:“5.2”},
{“日期”:1357716000000,“价值”:“5.2”},
{“日期”:1357716600000,“价值”:“5.1”},
{“日期”:1357717200000,“价值”:“5.5”},
]      
//将UTC格式化为js date obj的日期操作
data1.forEach(函数(d){d.time=newdate(d.time*1000);});
data2.forEach(函数(d){d.time=newdate(d.time*1000);});
//助手和常量
var保证金={“顶部”:50,“右侧”:50,“底部”:50,“左侧”:100,“轴”:55};
变量宽度=1500-margin.left-margin.right;
变量高度=580-margin.top-margin.bottom;
var timeFormat=d3.time.format(“%X”);
//查找数据范围
var x1Domain=d3.extent(数据1,函数(d){返回d.date;});
var x2Domain=d3.extent(数据2,函数(d){返回d.date;});
var x1Min=d3.min(数据1,函数(d){return Math.min(d.date);});
var x1Max=d3.max(数据1,函数(d){return Math.max(d.date);});
var x2Min=d3.min(数据2,函数(d){return Math.min(d.date);});
var x2Max=d3.max(数据2,函数(d){return Math.max(d.date);});
var y1Min=d3.min(data1,函数(d){return Math.min(d.value);});
var y1Max=d3.max(data1,函数(d){return Math.max(d.value);});
var y2Min=d3.min(数据2,函数(d){return Math.min(d.value);});
var y2Max=d3.max(数据2,函数(d){return Math.max(d.value);});
变量yMin=(y1分钟yMax)?y1Max:y2Max;
//天平
var x1Scale=d3.time.scale()
.域(d3.范围(数据1,函数(d){
返回d.date;})
.范围([0,宽度]);
var x2Scale=d3.time.scale()
.域(d3.范围(数据2,函数(d){
返回d.date;})
.范围([0,宽度]);
var yScale=d3.scale.linear()
.域([yMin,yMax])。范围([height,0]);
//设置轴
var x1Axis=d3.svg.axis()
.刻度(x1刻度)
.orient(“底部”)
.滴答声(5)
.1(5)
.格式(时间格式);
var x2Axis=d3.svg.axis()
.比例(x2比例)
.东方(“顶部”)
.滴答声(5)
.1(5)
.格式(时间格式);
var yAxis=d3.svg.axis()
.刻度(yScale)
.东方(“左”)
.蜱(5);
变量make_y_轴=函数(){
返回d3.svg.axis()
.刻度(yScale)
.东方(“左”)
.蜱(5);
};
//设置图表类型
//创建可以将数据转换为x和y点的直线函数
var line1=d3.svg.line().interpolate(“基”)
.x(功能(d){
返回量表(d.日期);
})
.y(功能(d){
返回Y刻度(d值);
});
var line2=d3.svg.line().interpolate(“基”)
.x(功能(d){
返回量表(d.日期);
})
.y(功能(d){
返回Y刻度(d值);
});
//创建缩放功能
var zoomBottom=d3.behavior.zoom()
.x(x1比例)
//.y(yScale);
.scaleExtent([1,10]);
var zoom=d3.behavior.zoom()
.x(x2比例)
//.y(yScale)
.scaleExtent([1,10])
。打开(“缩放”,缩放);
//创建拖动行为
var drag=d3.behavior.drag()
.origin(函数(d){return d;})
.on(“dragstart”,dragstart)
.打开(“拖动”,拖动)
.on(“dragend”,dragend)
//创建svg容器
var svg=d3。选择(“#图表”)
.append(“svg:svg”)
.attr('width',width+margin.left+margin.right)
.attr('height',height+margin.top+margin.bottom)
.append(“svg:g”)
.attr(“转换”、“平移”(“+margin.left+”,“+margin.top+”)
.呼叫(缩放);
append(“svg:rect”)
.attr(“宽度”,宽度)
.attr(“高度”,高度)
.attr(“类”、“图”);
函数绘图(){
//画轴
append(“svg:g”)
.attr(“类”,“x轴底部”)
.attr(“变换”、“平移(0)”、“高度+”)
.呼叫(x1轴);
append(“svg:g”)
.attr(“类”,“x轴顶部”)
.attr(“转换”、“转换(0,0)”)
.呼叫(X2轴);
svg.append(“g”)
.attr(“类”、“y轴”)
.呼叫(yAxis);
//网格图
svg.append(“g”)
.attr(“类”、“y网格”)
.调用(生成y轴()
.tickSize(-width,0,0)
.格式(“”);
//添加行
//在上面的轴之后执行此操作,以便线位于刻度线之上
var clip=svg.append(“svg:clipPath”)
.attr(“id”、“剪辑”)
.append(“svg:rect”)
.attr(“x1Scale”,0)
.attr(“x2Scale”,0)
.origin(function(){ var t = d3.select(this); return { x: t.attr('x') , y: t.attr('y') } })