首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为D3堆叠条形图准备嵌套的JSON数据

为D3堆叠条形图准备嵌套的JSON数据
EN

Stack Overflow用户
提问于 2019-09-01 15:40:57
回答 3查看 232关注 0票数 1

我有嵌套的JSON数据,其中第一级键是活动类型(骑行、徒步旅行等)。第二个层次是年份。每年都有一个值(以公里为单位的距离)。我的数据结构如下所示:

我想从我的数据中绘制一个堆叠的条形图,就像这样的http://bl.ocks.org/mstanaland/6100713。如何将数据放入适合D3堆叠条形图的结构中?

EN

回答 3

Stack Overflow用户

发布于 2019-09-01 16:45:47

这可以按如下方式完成:

代码语言:javascript
复制
const data = [];
myData.forEach(a => a.values.forEach(v => {
    const element = data.find(e => e.year === v.key);
    if (element) {
        element[a.key] = v.values;
    } else {
        data.push({ year: v.key, [a.key]: v.values });
    }
}));
票数 2
EN

Stack Overflow用户

发布于 2019-09-01 18:17:12

基于@unminder的答案,但只是将每个属性都放入对象中:

Stakblitz示例:https://stackblitz.com/edit/js-d5sitf

代码语言:javascript
复制
const entryArr = [
  {
    key: 'ride',
    values: [
      { key: '2008', value: 3234 },
      { key: '2009', value: 3234 },
      { key: '2010', value: 5000 },
      { key: '2011', value: 6000 },
      { key: '2012', value: 1456 },
      { key: '2013', value: 2453 }
    ]
  },
  {
    key: 'hike',
    values: [
      { key: '2006', value: 3234 },
      { key: '2009', value: 2420 },
      { key: '2010', value: 4530 },
      { key: '2011', value: 2000 },
      { key: '2012', value: 1900 },
      { key: '2013', value: 3700 }
    ]
  },
  {
    key: 'walk',
    values: [
      { key: '2009', value: 3001 },
      { key: '2010', value: 1090 },
      { key: '2011', value: 2020 },
      { key: '2012', value: 2000 },
      { key: '2013', value: 6000 }
    ]
  }
];

const getKeys = entryArr.map(x => x.key);
const result = [];
entryArr.forEach(a => a.values.forEach(v => {
  const element = result.find(e => e.year === v.key);
  if (element) {
    element[a.key] = v.value;
  } else {
    const obj = getKeys.reduce((acc, x) => ({ ...acc, year: v.key, [x]: a.key === x ? v.value : '' })
      , {});
    result.push(obj);
  }
}));

console.log(result)

注意:可以使用reducers来改进它,以避免全局变量

票数 1
EN

Stack Overflow用户

发布于 2019-09-01 17:57:09

这很有效,但当缺少组合时,不会输入任何条目,因此它不是真正的宽泛数据。我用下面的代码实现了这个功能:

代码语言:javascript
复制
// make data long
var flatdata = []
            distance_per_year.forEach(function(type) {
              type.values.forEach(function(typeYears) {
                flatdata.push({
                  type: type.key,
                  year: typeYears.key,
                  distance: typeYears.values,
                });
              });
            });

    // Unique activity types
    groups = Array.from(new Set(flatdata.map(({ type }) => type)));
    years = Array.from(new Set(flatdata.map(({ year }) => year)));

    // make wide data with 0 where value is missing
    var grouped = years.map(function(d) {
      var item = {
        year:  d
      };
      groups.forEach(function(e) {
        var itemForGroup = flatdata.filter(function(f) {
          return f.type === e && f.year === d;
        });
        if (itemForGroup.length) {
          item[e] = Number(itemForGroup[0].distance);
        } else {
          item[e] = 0;
        }
      })
      return item;
    })

这将首先生成一个未嵌套的长数据集(3列),然后将其重塑为宽,并在缺少距离的位置填充0。

来源是这两个问题:Reshape data for D3 stacked bar chartd3: flatten nested data?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57744084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档