堆叠d3条形图 - 指定x / y值

时间:2015-01-08 16:15:07

标签: javascript python django d3.js

我的数据类似于:

var students = [

{'race': 'Black', 'count': 7, 'year': 2004, 'allnames': ['G Brown', 'F Clarkson', 'E Miller', 'R Black', 'R Tasker', 'T Witter', 'W Garde']}, 
{'race': 'White', 'count': 9, 'year': 2004, 'allnames': ['J Finley', 'M Wenk', 'A Booker', 'C Bush', 'D Jackson', 'E Santoro', 'W Rosen', 'P Bamford', 'H Larson']},
{'race': 'Hispanic', 'count': 2, 'year': 2004, 'allnames': ['T Greene', 'R Golden']},
{'race': 'Asian', 'count': 3, 'year': 2004, 'allnames': ['R Natal', 'G Goldsmith']},

{'race': 'Black', 'count': 6, 'year': 2006, 'allnames': ['R Paul', 'A Gaul', 'P Cathay', 'W Kotch', 'J Nutter', 'J Street']}, 
{'race': 'White', 'count': 4, 'year': 2006, 'allnames': ['M Zuckerberg', 'D Chang', 'V Cruz', 'S Spelman']},
{'race': 'Hispanic', 'count': 3, 'year': 2006, 'allnames': ['T Rossen', 'R Russo',  'M Abbed']},
{'race': 'Asian', 'count': 1, 'year': 2006, 'allnames': ['R Lopez']}

//....

]

我希望x轴上的年份和我的y轴上有一个堆积的图表 如果x& amp; y值在它们自己的对象中被隔离,但我的对象中也有其他数据。如何将我想要的值(只是年份和计数)传递给d3图表?

我的计划是将其他数据传递给工具提示,因此我需要将其保留。我是否需要构建我传入的数据不同,或者我可以使用我的数据集吗?

我正在查看d3堆栈文档: https://github.com/mbostock/d3/wiki/Stack-Layout#values

我需要在d.values取代{<1}}?

var stack = d3.layout.stack()
    .offset("wiggle")
    .values(function(d) { return d.values; });

注意 - 这是来自Python Django查询集 - 因此附加标签但我不知道有多重要。

谢谢!

另外 - 请看我的数据全部在一个巨大的数组中...... d3是否要求每个系列都在自己的数组中?

1 个答案:

答案 0 :(得分:0)

d3.layout.stack正在寻找要堆叠的对象数组,每个数组表示与特定维度关联的数据点,每个X坐标的值为Y.在您的情况下,您可能希望使用d3.nest或类似函数来嵌套数据,使其看起来像:

 [
  {"race": "Black", values: [
   {year: 2004, "count": 9},
   {year: 2005, "count": 6}
   ]
  },
  {"race": "White", values: [
   {year: 2004, "count": 9},
   {year: 2005, "count": 4}
   ]
  }
 ]

但是堆栈期望您的对象具有xy值,因此您不能只是嵌套和创建这样的对象,您需要最终得到:

 [
  {"race": "Black", values: [
   {x: 2004, y: 9},
   {x: 2005, y: 6}
   ]
  },
  {"race": "White", values: [
   {x: 2004, y: 9},
   {x: 2005, y: 4}
   ]
  }
 ]

这是要理解的更复杂的D3程序之一。您可以在此处查看如何创建格式化数据的示例:

http://bl.ocks.org/emeeks/b4184089c979aeae28bb