【问题标题】:D3 unusual stacked bar chartD3异常堆积条形图
【发布时间】:2017-06-28 15:36:56
【问题描述】:

我需要做一个不寻常的堆积条形图,实际上,我不知道该怎么做。

总的来说,这听起来很容易:

我有一个 CSV 文件,其中包含不同的值,可以是 int 或 string。每行都有相同数量的值。

我现在需要做一个堆积条形图,它执行以下操作:

-每列一个栏 - 每列需要具有相同的高度(导致每列的条目数量相同) 并且每个柱需要有不同数量的堆栈,每个存在的不同值对应一个堆栈。 (一个值存在的频率越高,这个堆栈就应该越大)

CSV 文件示例如下:

Day, Value
Mo, 5
Mo, 3
Tu, 5
Tu, 6

所以对于 Day 行,我需要 2 个高度相同的堆栈,而对于 Value 行,我需要 3 个堆栈,其中一个是 1/2 高度,另外两个是 1/4。

这就是我遇到的问题。我可以在互联网上找到的每个示例都适用于每个条的相同数量的堆栈。 (例如:https://bl.ocks.org/mbostock/3886394https://bl.ocks.org/mbostock/1134768

有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: javascript d3.js stacked


    【解决方案1】:

    您需要将每一列作为单独的堆栈处理,并将它们放置在图表中。这个小提琴:https://jsfiddle.net/gwhn1sgv/2/ 展示了如何。

    i 的数据。 e.第一列需要转换成这样的直方图:

    var column = 'Day';
    var histo = { Mo: 2, Tu: 2 }
    

    然后你可以堆叠和转换它们:

    var keys = Object.keys(histo);
    var stack = d3.stack()
      .keys(keys)([histo])
      //unpack the column
      .map((d, i) => {
        return {key: keys[i], data: d[0]}
      });
    

    所以它们看起来像这样:

    var stack = [
        { key: 'Mo', data: [0, 2] },
        { key: 'Tu', data: [2, 4] }
    ]
    

    如果你有一个乐队规模

    var x = d3.scaleBand()
       .domain(data.columns);
    

    你可以在x(column)建立条形图列:

    chart.append('g')
      .selectAll('rect')
      .data(stack)
      .enter().append('rect')
         // position in the x-axis
        .attr('x', x(column))
        .attr('y', d => y(d.data[0]))
        .attr("height", d => y(d.data[1]) - y(d.data[0]))
        .attr("width", x.bandwidth());
    

    【讨论】:

    • 非常感谢!我明天会尝试实现这个,但它似乎解决了我的问题
    • 嘿,又是我...我还有两个问题,尝试了一天后我放弃了。第一:假设我有一个更大的 csv 文件,包含 10-20 列,我想只用 4-5 个特定列构建它,我如何过滤我想要使用的列?我试过:d3.keys(data[0]).filter(function(d) { return d.match(/.../); }) 但我真的不知道我必须在哪里实现它。我一开始就想,但是怎么做?第二:是否有可能在每个堆栈之间添加一点“空间”?其实我真的很想自己做这件事,但似乎我对 d3 很无聊..
    • 1.在将 csv 加载到data 之后和for...of 循环之前直接添加data.columns.filter()。 (小提琴中的第 2 行) 2. 使用 x.padding() 方法,就像小提琴中的第 6 行一样。
    • 1:如果我只是将行 data.columns.filter(function(d) {return d.match(/Day/);}); 添加到小提琴的第二行,则不会发生任何事情。如果我写data=data.columns.filter(function(d) {return d.match(/Day/);});data2=...(并在任何地方用data2替换数据)我会得到错误:无法获取未定义或空引用的属性“长度”并且如果我记录data.columns它未定义。那是我一直被卡住的错误.. 2:对不起,表述不好,我的意思是:向 z 添加一点填充,以便每行的不同堆栈不直接相邻。
    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多