码迷,mamicode.com
首页 > 其他好文 > 详细

[D3] Build a Line Chart with D3 v4

时间:2017-08-14 21:28:31      阅读:366      评论:0      收藏:0      [点我收藏+]

标签:range   json   scale   ram   nec   each   height   embed   err   

Line charts are often used to plot temporal data, like a stock price over time. In this lesson we’ll see how to use D3 APIs to create our own simplified version of the charts seen on Google Finance.

 

var margin = {
    top: 10,
    right: 20,
    bottom: 65,
    left: 40
};
var width = 400 - margin.left - margin.right;
var height = 600 - margin.top - margin.bottom;

var svg = d3.select(‘.chart‘)
    .append(‘svg‘)
    .attr(‘width‘, width + margin.left + margin.right)
    .attr(‘height‘, height + margin.top + margin.bottom)
    .call(responsivefy)
    .append(‘g‘)
    .attr(‘transform‘, ‘translate(‘ + margin.left + ‘, ‘ + margin.top + ‘)‘);




/**
 * Load data
 */
d3.json(‘../data/data3.json‘, function (err, data) {
    const parseTime = d3.timeParse(‘%Y/%m/%d‘);

    data.forEach(company => {
        company.values.forEach(d => {
            d.date = parseTime(d.date)
            d.close = +d.close
        })
    })

    /**
     * x axis
     */
    const xScale = d3.scaleTime()
        .domain([
            d3.min(data, co => d3.min(co.values, d => d.date)),
            d3.max(data, co => d3.max(co.values, d => d.date))
        ])
        .range([0, width])
        .nice();
    svg.append(‘g‘)
            .attr(‘transform‘, `translate(0, ${height})`)
        .call(d3.axisBottom(xScale).tickSize(10).tickPadding(5))
        .selectAll(‘text‘)
        .attr(‘text-anchor‘, ‘end‘)
        .attr(‘transform‘, ‘rotate(-45)‘);

    /**
     * Y axis
     */    
    const yScale = d3.scaleLinear()
        .domain([
            d3.min(data, co => d3.min(co.values, d => d.close)),
            d3.max(data, co => d3.max(co.values, d => d.close))            
        ])
        .range([height, 0])
        .nice();
    svg.append(‘g‘)
        .call(d3.axisLeft(yScale));  
        
    /**
     * Create lines
     */    
    const line = d3.line()
        .x(d => xScale(d.date))
        .y(d => yScale(d.close))
        .curve(d3.curveCatmullRom.alpha(0.5)); //smmoth the line

    svg
        .selectAll(‘.line‘)
        .data(data)
        .enter()
        .append(‘path‘)
        .attr(‘class‘, ‘line‘)
        .attr(‘d‘, d => line(d.values)) // draw the line
        .style(‘stroke‘, (d, i) => [‘#FF9900‘, ‘#3369E8‘][i])
        .style(‘stroke-width‘, 2)
        .style(‘fill‘, ‘none‘);    
});







function responsivefy(svg) {
    // get container + svg aspect ratio
    var container = d3.select(svg.node().parentNode),
        width = parseInt(svg.style("width")),
        height = parseInt(svg.style("height")),
        aspect = width / height;

    // add viewBox and preserveAspectRatio properties,
    // and call resize so that svg resizes on inital page load
    svg.attr("viewBox", "0 0 " + width + " " + height)
        .attr("preserveAspectRatio", "xMinYMid")
        .call(resize);

    // to register multiple listeners for same event type,
    // you need to add namespace, i.e., ‘click.foo‘
    // necessary if you call invoke this function for multiple svgs
    // api docs: https://github.com/mbostock/d3/wiki/Selections#on
    d3.select(window).on("resize." + container.attr("id"), resize);

    // get width of container and resize svg to fit it
    function resize() {
        var targetWidth = parseInt(container.style("width"));
        svg.attr("width", targetWidth);
        svg.attr("height", Math.round(targetWidth / aspect));
    }
}

 

 

[D3] Build a Line Chart with D3 v4

标签:range   json   scale   ram   nec   each   height   embed   err   

原文地址:http://www.cnblogs.com/Answer1215/p/7359827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!