javascript - 使用 d3.js 的分层条形图

标签 javascript css svg d3.js

我正在尝试在条形图中创建一个条形图,也称为分层条形图。我的示例代码如下。

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
    </head>
<body>
    <script>
        var dataArray = [10, 20, 40, 60];
        var canvas = d3.select("body").append("svg").attr("width", 500).attr("height", 500);

        var bars = canvas.selectAll("rect").data(dataArray).enter().append("rect").attr("width", function(d){
            return d * 10;
        }).attr("height", 30).attr("y", function(d, i){
            return i * 35;
        }).attr("fill", "blue").attr("fill-width", "green");

        canvas.append("text").text(function(d){
            return d;
        }).attr;



        var dataArray1 = [5, 10, 20, 30];

        var bars1 = canvas.selectAll("rect").data(dataArray1).enter().append("rect").attr("width", function(d){
            return d * 7;
        }).attr("height", 20).attr("y", function(d, i){
            return (i*35) + 5;
        }).attr("fill", "red").attr("fill-width", "black");;

    </script>
</body>
</html>

这里的bars和bar1是绘制在svg容器上的条形图。我的问题是当较长的条形可见时,较小的条形不可见。但我试图在较长的条形图内放置较小的条形图,以便它看起来像下图。 enter image description here .

但是我做不到。评论较长的条形图代码显示较小的条形图。有什么帮助吗?谢谢

最佳答案

一种可能的解决方案,请参阅 example at jsbin .

问题是数组的长度没有变化,所以 enter() 没有任何可追加的内容。必须扩展第一个数组,以便创建新元素。

var dataArray1 = [5, 10, 20, 30];
var offset = dataArray1.length;
dataArray = dataArray.concat(dataArray1);

var bars1 = canvas.selectAll("rect")
//    .data(dataArray1)
    .data(dataArray)
    .enter()
    .append("rect")
        .attr("width", function(d){
            return d * 7;
        })
        .attr("height", 20)
        .attr("y", function(d, i){
            return ((i - offset)*35) + 5;
        })
        .attr("fill", "red");
        //.attr("fill-width", "black");

更新:另一种更改较少的解决方案添加了 class 属性,用于区分基础栏和添加栏。参见 example at jsbin .

var bars = canvas.selectAll("rect")
    .data(dataArray)
    .enter()
    .append("rect")
        .attr('class', 'base')
        ...

var dataArray1 = [5, 10, 20, 30];

var bars1 = canvas.selectAll("rect.addon")
    .data(dataArray1)
    .enter()
    .append("rect")
        .attr('class', 'addon')
        ...

关于javascript - 使用 d3.js 的分层条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22804197/

相关文章:

javascript - 如何使 localStorage 在 Opera 中工作

javascript - 另一个元素后面的 Canvas 上的事件监听器

javascript - 如何使用 javascript vuejs 有条件地导入内部 css?

d3.js - 如何在 ViewBox 中使用 D3 缩放行为而不是变换

javascript - 如何在 XML 代码中将图像直接添加到 SVG

javascript - cocoonJS CSS 不工作

javascript - Bootstrap 多重网格

jquery - 从 WebForm 代码隐藏中使用 JQuery 更改 CSS

javascript - 在jsnetworkx中绘制平行边

javascript - Plupload 可以与 Ruby on Rails 一起使用吗?