【发布时间】:2016-04-02 19:28:01
【问题描述】:
我正在尝试让 d3 绘制单个堆叠条形图,如下所示:
<svg width = '500' height= '100'>
<rect x='0' y='0' width='224' height='30' fill='green'/>
<rect x='224' y='0' width='84' height='30' fill='blue'/>
<rect x='308' y='0' width='29' height='30' fill='darkgray'/>
<rect x='337' y='0' width='3' height='30' fill='#606060'/>
</svg>
如您所见,x 位置从零开始,然后每个后续 x 位置都等于前面宽度的总和。
所以我试图让 d3 从一个名为 datavars 的数组中绘制类似的东西:
var datavars = [224, 84, 29, 3];
...并确保 d3 将正确的宽度值分配给正确的 x 值,我创建了这些变量:
var prev_width0 = 0;
var prev_width1 = datavars[0];
var prev_width2 = datavars[0] + datavars[1];
var prev_width3 = datavars[0] + datavars[1] + datavars[2];
... 并像这样定义 x 值:
//create SVG element
var svg = d3.select('body')
.append('svg')
.attr('width', w)
.attr('height', h);
svg.selectAll('rect')
.data(datavars)
.enter()
.append('rect')
.attr('width', function(d){
return d;})
.attr('x',function(d, i){
return 'prev_width'+i; })
.attr('y',0)
.attr('height', 30);
正如您可能已经猜到的那样,强缩进函数(基于前面宽度的总和,并在prev_width 变量中定义)为每次迭代(prev_width0、prev_width1 等)返回一个字符串,并且 不是我认为我在创建 prev_width 变量时定义的值。
我显然错误地定义了变量。知道如何正确执行此操作吗?
【问题讨论】:
标签: javascript d3.js var