d3_v5.js实现堆栈图

json文本

[
    {
        "name": "成都",
        "sales": [
            {
                "year": "2002",
                "profit": 20.49
            },
            {
                "year": "2003",
                "profit": 20.017
            },
            {
                "year": "2004",
                "profit": 19.27
            },
            {
                "year": "2005",
                "profit": 20.281
            },
            {
                "year": "2006",
                "profit": 21.839
            },
            {
                "year": "2007",
                "profit": 19.756
            },
            {
                "year": "2008",
                "profit": 20.368
            },
            {
                "year": "2009",
                "profit": 19.945
            },
            {
                "year": "2010",
                "profit": 20.798
            },
            {
                "year": "2011",
                "profit": 19.374
            },
            {
                "year": "2012",
                "profit": 20.64
            },
            {
                "year": "2013",
                "profit": 21.264
            }
        ]
    },
    {
        "name": "重庆",
        "sales": [
            {
                "year": "2002",
                "profit": 27.547
            },
            {
                "year": "2003",
                "profit": 27.107
            },
            {
                "year": "2004",
                "profit": 26.747
            },
            {
                "year": "2005",
                "profit": 27.835
            },
            {
                "year": "2006",
                "profit": 29.371
            },
            {
                "year": "2007",
                "profit": 26.465
            },
            {
                "year": "2008",
                "profit": 27.619
            },
            {
                "year": "2009",
                "profit": 27.406
            },
            {
                "year": "2010",
                "profit": 28.015
            },
            {
                "year": "2011",
                "profit": 27.481
            },
            {
                "year": "2012",
                "profit": 27.529
            },
            {
                "year": "2013",
                "profit": 29.032
            }
        ]
    },
    {
        "name": "广州",
        "sales": [
            {
                "year": "2002",
                "profit": 28.13
            },
            {
                "year": "2003",
                "profit": 30.035
            },
            {
                "year": "2004",
                "profit": 28.019
            },
            {
                "year": "2005",
                "profit": 29.32
            },
            {
                "year": "2006",
                "profit": 29.073
            },
            {
                "year": "2007",
                "profit": 29.953
            },
            {
                "year": "2008",
                "profit": 28.557
            },
            {
                "year": "2009",
                "profit": 28.965
            },
            {
                "year": "2010",
                "profit": 29.365
            },
            {
                "year": "2011",
                "profit": 28.902
            },
            {
                "year": "2012",
                "profit": 28.893
            },
            {
                "year": "2013",
                "profit": 28.659
            }
        ]
    },
    {
        "name": "南京",
        "sales": [
            {
                "year": "2002",
                "profit": 28.273
            },
            {
                "year": "2003",
                "profit": 29.028
            },
            {
                "year": "2004",
                "profit": 29.212
            },
            {
                "year": "2005",
                "profit": 28.676
            },
            {
                "year": "2006",
                "profit": 28.808
            },
            {
                "year": "2007",
                "profit": 28.692
            },
            {
                "year": "2008",
                "profit": 29.045
            },
            {
                "year": "2009",
                "profit": 28.44
            },
            {
                "year": "2010",
                "profit": 28.339
            },
            {
                "year": "2011",
                "profit": 28.622
            },
            {
                "year": "2012",
                "profit": 29.488
            },
            {
                "year": "2013",
                "profit": 30.459
            }
        ]
    },
    {
        "name": "上海",
        "sales": [
            {
                "year": "2002",
                "profit": 28.018
            },
            {
                "year": "2003",
                "profit": 29.224
            },
            {
                "year": "2004",
                "profit": 29.555
            },
            {
                "year": "2005",
                "profit": 29.129
            },
            {
                "year": "2006",
                "profit": 29.084
            },
            {
                "year": "2007",
                "profit": 29.232
            },
            {
                "year": "2008",
                "profit": 29.603
            },
            {
                "year": "2009",
                "profit": 28.56
            },
            {
                "year": "2010",
                "profit": 28.615
            },
            {
                "year": "2011",
                "profit": 29.253
            },
            {
                "year": "2012",
                "profit": 29.441
            },
            {
                "year": "2013",
                "profit": 30.623
            }
        ]
    },
    {
        "name": "武汉",
        "sales": [
            {
                "year": "2002",
                "profit": 28.721
            },
            {
                "year": "2003",
                "profit": 30.141
            },
            {
                "year": "2004",
                "profit": 29.365
            },
            {
                "year": "2005",
                "profit": 30.061
            },
            {
                "year": "2006",
                "profit": 29.797
            },
            {
                "year": "2007",
                "profit": 29.623
            },
            {
                "year": "2008",
                "profit": 29.287
            },
            {
                "year": "2009",
                "profit": 29.606
            },
            {
                "year": "2010",
                "profit": 29.556
            },
            {
                "year": "2011",
                "profit": 29.765
            },
            {
                "year": "2012",
                "profit": 30.605
            },
            {
                "year": "2013",
                "profit": 31.171
            }
        ]
    }
]

代码部分

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="d3.js"></script>
    <title>堆栈图</title>
</head>
<style>
    .axis path,
    .axis line {
        fill: none;
        stroke: black;
        shape-rendering: crispEdges;
    }

    .axis text {
        font-family: sans-serif;
        font-size: 11px;
    }
</style>
<body>
    <script>
        d3.json("竞赛图.json", function (updata) {
            var width = 700; //SVG绘制区域的宽度
            var height = 500; //SVG绘制区域的高度

            var svg = d3.select("body") //选择<body>
                .append("svg") //在<body>中添加<svg>
                .attr("width", width) //设定<svg>的宽度属性
                .attr("height", height); //设定<svg>的高度属性
            //2. 转换数据
            var stack = d3.layout.stack()
                .values(function (d) {
                    return d.sales;
                })
                .x(function (d) {
                    return d.year;
                })
                .y(function (d) {
                    return d.profit;
                });

            var data = stack(updata);



            //3. 绘制

            //外边框
            var padding = {
                left: 50,
                right: 100,
                top: 30,
                bottom: 30
            };

            //创建x轴比例尺
            var xRangeWidth = width - padding.left - padding.right;

            var xScale = d3.scale.ordinal()
                .domain(data[0].sales.map(function (d) {
                    return d.year;
                }))
                .rangeBands([0, xRangeWidth], 0.3);

            //创建y轴比例尺

            //(定义域的最大值)
            var maxProfit = d3.max(data[data.length - 1].sales, function (d) {
                return d.y0 + d.y;
            });

            //最大高度(值域的最大值)
            var yRangeWidth = height - padding.top - padding.bottom;

            var yScale = d3.scale.linear()
                .domain([0, maxProfit]) //定义域
                .range([0, yRangeWidth]); //值域

            var area = d3.svg.area()
                .x(function (d) {
                    return xScale(d.year) + xScale.rangeBand() / 2;
                })
                .y0(function (d) {
                    return yRangeWidth - yScale(d.y0);
                })
                .y1(function (d) {
                    return yRangeWidth - yScale(d.y0 + d.y);
                })
                .interpolate("basis");

            //颜色比例尺
            var color = d3.scale.category10();

            //添加分组元素
            var groups = svg.selectAll("g")
                .data(data)
                .enter()
                .append("g")
                .style("fill", function (d, i) {
                    return color(i);
                });

            //添加区域
            var areas = groups.append("path")
                .attr("d", function (d) {
                    console.log(d.sales);
                    return area(d.sales);
                })
                .attr("transform", "translate(" + padding.left + "," + padding.top + ")");

            //添加坐标轴
            var xAxis = d3.svg.axis()
                .scale(xScale)
                .orient("bottom");

            yScale.range([yRangeWidth, 0]);

            var yAxis = d3.svg.axis()
                .scale(yScale)
                .orient("left");

            svg.append("g")
                .attr("class", "axis")
                .attr("transform", "translate(" + padding.left + "," + (height - padding.bottom) + ")")
                .call(xAxis);

            svg.append("g")
                .attr("class", "axis")
                .attr("transform", "translate(" + padding.left + "," + (height - padding.bottom - yRangeWidth) +
                    ")")
                .call(yAxis);

            //添加分组标签
            var labHeight = 50;
            var labRadius = 10;

            var labelCircle = groups.append("circle")
                .attr("cx", function (d) {
                    return width - padding.right * 0.98;
                })
                .attr("cy", function (d, i) {
                    return padding.top * 2 + labHeight * i;
                })
                .attr("r", labRadius);

            var labelText = groups.append("text")
                .attr("x", function (d) {
                    return width - padding.right * 0.8;
                })
                .attr("y", function (d, i) {
                    return padding.top * 2 + labHeight * i;
                })
                .attr("dy", labRadius / 2)
                .text(function (d) {
                    return d.name;
                });
        });
    </script>
</body>

</html>

效果展示

 


版权声明:本文为weixin_62268437原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。