d3.js(v3)折线图上的工具提示

时间:2017-06-24 16:17:18

标签: d3.js

我正在尝试为折线图实施工具提示。图表正确显示。在图表上徘徊时出现错误“无法读取未定义的属性时间” 我正在使用d3版本3。

代码是:

function lineChart(data, id){
    // Set the dimensions of the canvas / graph
    var margin = {top: 30, right: 20, bottom: 30, left: 50},
        width = 1000 - margin.left - margin.right,
        height = 370 - margin.top - margin.bottom;

    // Parse the date / time
    var parseDate = d3.time.format("%d-%b-%y").parse;
    // Define the div for the tooltip
    var div = d3.select("body").append("div")   
        .attr("class", "tooltip")               
        .style("opacity", 0);
    // Set the ranges
    var x = d3.time.scale().range([0, width]);
    var y = d3.scale.linear().range([height, 0]);

    // Define the axes
    var xAxis = d3.svg.axis().scale(x)
        .orient("bottom").ticks(5);

    var yAxis = d3.svg.axis().scale(y)
        .orient("left").ticks(5);

    // Define the line
    var valueline = d3.svg.line()
        .x(function(d) { return x(d.time); })
        .y(function(d) { return y(d.loadaverage); });

    // Adds the svg canvas
    var svg = d3.select(id)
        .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 + ")");


    // Scale the range of the data
    x.domain(d3.extent(data, function(d) { return d.time; }));
    y.domain([0, d3.max(data, function(d) { return d.loadaverage; })]);

    // Add the valueline path.
    svg.append("path")
        .attr("class", "line")
        .attr("d", valueline(data))
        .on("mouseover", function(d) {      
            div.transition()        
                .duration(200)      
                .style("opacity", .9);      
            div.html(d.time + "<br/>"  + d.loadaverage)
                .style("left", (d3.event.pageX) + "px")     
                .style("top", (d3.event.pageY - 28) + "px");    
            })                  
        .on("mouseout", function(d) {       
            div.transition()        
                .duration(500)      
                .style("opacity", 0);   
        });
    // Add the X Axis
    svg.append("g")
        .attr("class", "x axis")
        .attr("transform", "translate(0," + height + ")")
        .call(xAxis);

    // Add the Y Axis
    svg.append("g")
        .attr("class", "y axis")
        .call(yAxis);
}

1 个答案:

答案 0 :(得分:1)

我猜你永远不会将你的svg元素绑定到你的数据上。 该步骤通常通过在您正在创建的选择上调用以下行来完成:

.data(your_data)
.enter() // You are now entering to the selection bound to 'your_data'

因为你的数据和你的svg元素没有绑定,所以

.on("mouseover", function(d) {

d未定义。

您可以尝试通过以这种方式绑定数据来修复它:

svg.selectAll('path')
    .data(data)
    .enter()
    .append("path")
    .attr("class", "line")
    // your code logics continues here

如果需要,您可以看到例如d3 documentationScott Murray’s guide to data binding