Reputation: 37
still quite new to d3.js but I'm trying to work off Mike Bostock's example of a grouped bar chart here: http://bl.ocks.org/mbostock/3887051
The issue is that my data is sorted differently compared to the example CSV and I'm having trouble making it work.
Sample of example CSV:
CA,2704659,4499890,2159981,3853788,10604510,8819342,4114496
TX,2027307,3277946,1420518,2454721,7017731,5656528,2472223
NY,1208495,2141490,1058031,1999120,5355235,5120254,2607672
Sample of my CSV:
Year, Sex, Cause, Value
1979,Males,Colorectal cancer,20378
1980,Males,Colorectal cancer,20065
1981,Males,Colorectal cancer,20908
1979,Females,Colorectal cancer,19178
1980,Females,Colorectal cancer,18100
1981,Females,Colorectal cancer,17650
In the example CSV, all the data for each group of bars is sorted into one row of values. Whereas for my CSV, they're not organized neatly into one line.
I'm trying to group the values for Male and Female under each Cause and sorted by Year like so: https://i.sstatic.net/pU15l.jpg
If anyone could explain to me how I should work with this data in making a group bar chart it'd be greatly appreciated.
Upvotes: 0
Views: 483
Reputation: 25194
var valueKeys = ['MALE', 'FEMALE'];
var data = d3.csv.parse(csv)
.map(function(v)
{
d3.keys(v).forEach(function(k)
{
if(k != 'CAUSE')
{
v[k] = Number(v[k]);
}
});
return v;
})
.filter(function(v)
{
return v['YEAR'] == 1979;
})
.map(function(v)
{
// convert data for plotting groups
v['values'] = valueKeys.map(function(k)
{
return {
'name' : k,
'value' : v[k]
};
});
return v;
});
var margin = {
'top' : 20,
'right' : 80,
'bottom' : 30,
'left' : 150
};
var width = 600 - margin['left'] - margin['right'];
var height = 400 - margin['top'] - margin['bottom'];
var y0 = d3.scale.ordinal().rangeRoundBands([0, height], 0.1);
y0.domain(data.map(function(v)
{
return v['CAUSE'];
}));
var y1 = d3.scale.ordinal();
y1.domain(valueKeys).rangeRoundBands([0, y0.rangeBand()]);
var x = d3.scale.linear().range([0, width]);
x.domain([0, d3.max(data, function(v)
{
return d3.max(valueKeys.map(function(k)
{
return v[k];
}));
})]);
var color = d3.scale.category10();
var yAxis = d3.svg.axis()
.scale(y0)
.orient('left');
var svg = d3.select('#chart').append('svg')
.attr("width", width + margin['left'] + margin['right'])
.attr("height", height + margin['top'] + margin['bottom'])
.append('g')
.attr('transform', 'translate(' + margin['left'] + ',' + margin['top'] + ')');
svg.append('g')
.attr('class', 'y axis')
.call(yAxis);
var cause = svg.selectAll('.cause')
.data(data)
.enter()
.append('g')
.attr('class', 'g')
.attr('transform', function(v)
{
return 'translate(0,' + y0(v['CAUSE']) + ')';
});
cause.selectAll('rect')
.data(function(v)
{
return v['values'];
})
.enter()
.append('rect')
.attr('height', y1.rangeBand())
.attr('x', 6)
.attr('y', function(d)
{
return y1(d['name']);
})
.attr('width', function(d)
{
return x(d['value']);
})
.style('fill', function(d)
{
return color(d['name']);
});
cause.selectAll('text')
.data(function(v)
{
return v['values'];
})
.enter()
.append('text')
.attr("x", function(d) { return x(d['value']) + 10; })
.attr("y", function(d)
{
return y1(d['name']) + y1.rangeBand() / 2;
})
.attr("dy", ".35em")
.attr('fill', '#000')
.text(function(d) { return d['value']; });
body {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
<div id='chart'></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<script>
var csv = "YEAR,CAUSE,MALE,FEMALE\n1979,Colorectal cancer,20378,19178\n1979,Lung cancer,63925,21093\n1979,Prostate cancer,6403,43923\n1979,Acute myocardial infarction,161723,45470\n1979,Cerebrovascular diseases,35719,29415\n1979,All stroke,31951,27062\n1979,Unintentional injuries,316585,98160\n1979,Suicides,89943,27078\n1980,Colorectal cancer,20065,18100\n1980,Lung cancer,65650,21993\n1980,Prostate cancer,6180,43938\n1980,Acute myocardial infarction,155525,44623\n1980,Cerebrovascular diseases,32367,28014\n1980,All stroke,28780,25437\n1980,Unintentional injuries,292815,95622\n1980,Suicides,87933,25433\n1981,Colorectal cancer,20908,17650\n1981,Lung cancer,65000,24228\n1981,Prostate cancer,6447,44070\n1981,Acute myocardial infarction,150873,44248\n1981,Cerebrovascular diseases,31559,28782\n1981,All stroke,28504,26482\n1981,Unintentional injuries,286796,86555\n1981,Suicides,89530,25188\n1982,Colorectal cancer,20073,17450\n1982,Lung cancer,67768,26050\n1982,Prostate cancer,6698,45380\n1982,Acute myocardial infarction,142450,41878\n1982,Cerebrovascular diseases,30740,26212\n1982,All stroke,27763,24580\n1982,Unintentional injuries,228691,71820\n1982,Suicides,95460,25090\n1983,Colorectal cancer,20105,16798\n1983,Lung cancer,70178,26495\n1983,Prostate cancer,6973,45133\n1983,Acute myocardial infarction,136817,39900\n1983,Cerebrovascular diseases,30210,26042\n1983,All stroke,27136,24014\n1983,Unintentional injuries,226561,69950\n1983,Suicides,99543,26313\n1984,Colorectal cancer,20028,18280\n1984,Lung cancer,72638,29505\n1984,Prostate cancer,6395,46290\n1984,Acute myocardial infarction,131310,38395\n1984,Cerebrovascular diseases,28820,23353\n1984,All stroke,25950,22043\n1984,Unintentional injuries,216741,67212\n1984,Suicides,92298,23380\n1985,Colorectal cancer,20320,16488\n1985,Lung cancer,70358,32358\n1985,Prostate cancer,8018,49340\n1985,Acute myocardial infarction,125305,37108\n1985,Cerebrovascular diseases,26436,22845\n1985,All stroke,23798,21275\n1985,Unintentional injuries,208342,67774\n1985,Suicides,87815,21313\n1986,Colorectal cancer,21665,17315\n1986,Lung cancer,72562,32635\n1986,Prostate cancer,8598,50790\n1986,Acute myocardial infarction,119969,36320\n1986,Cerebrovascular diseases,26361,23246\n1986,All stroke,24014,21341\n1986,Unintentional injuries,199507,65819\n1986,Suicides,97613,25295\n1987,Colorectal cancer,21128,17323\n1987,Lung cancer,73002,35153\n1987,Prostate cancer,8437,51813\n1987,Acute myocardial infarction,112582,34823\n1987,Cerebrovascular diseases,26209,20540\n1987,All stroke,23974,19117\n1987,Unintentional injuries,208061,66862\n1987,Suicides,95108,24840\n1988,Colorectal cancer,21235,16745\n1988,Lung cancer,73873,35230\n1988,Prostate cancer,8550,50425\n1988,Acute myocardial infarction,107243,32314\n1988,Cerebrovascular diseases,25042,22471\n1988,All stroke,22949,21119\n1988,Unintentional injuries,203150,60174\n1988,Suicides,93940,24675\n1989,Colorectal cancer,21368,15308\n1989,Lung cancer,76002,36683\n1989,Prostate cancer,8428,51648\n1989,Acute myocardial infarction,101850,30230\n1989,Cerebrovascular diseases,25341,21467\n1989,All stroke,23376,20302\n1989,Unintentional injuries,202033,69584\n1989,Suicides,92285,24905\n1990,Colorectal cancer,22580,16640\n1990,Lung cancer,75220,37477\n1990,Prostate cancer,9113,52790\n1990,Acute myocardial infarction,94120,29693\n1990,Cerebrovascular diseases,26362,20108\n1990,All stroke,24280,18736\n1990,Unintentional injuries,186364,60084\n1990,Suicides,92135,23058\n1991,Colorectal cancer,21835,15338\n1991,Lung cancer,76267,40567\n1991,Prostate cancer,9618,51288\n1991,Acute myocardial infarction,91062,28115\n1991,Cerebrovascular diseases,25173,20619\n1991,All stroke,23498,19204\n1991,Unintentional injuries,178329,58707\n1991,Suicides,98460,22808\n1992,Colorectal cancer,21650,16105\n1992,Lung cancer,75032,42660\n1992,Prostate cancer,9068,51418\n1992,Acute myocardial infarction,89067,26055\n1992,Cerebrovascular diseases,23284,19747\n1992,All stroke,20957,18810\n1992,Unintentional injuries,170103,56085\n1992,Suicides,100165,25393\n1993,Colorectal cancer,21808,15925\n1993,Lung cancer,74121,44012\n1993,Prostate cancer,9165,50980\n1993,Acute myocardial infarction,86752,26025\n1993,Cerebrovascular diseases,26339,21014\n1993,All stroke,23941,19480\n1993,Unintentional injuries,175075,62672\n1993,Suicides,101720,24520\n1994,Colorectal cancer,21828,15888\n1994,Lung cancer,73350,44670\n1994,Prostate cancer,9050,54663\n1994,Acute myocardial infarction,82373,25700\n1994,Cerebrovascular diseases,24313,20502\n1994,All stroke,22224,19262\n1994,Unintentional injuries,162066,53766\n1994,Suicides,99790,24818\n1995,Colorectal cancer,22568,16265\n1995,Lung cancer,70405,44150\n1995,Prostate cancer,9365,52433\n1995,Acute myocardial infarction,77342,25295\n1995,Cerebrovascular diseases,24429,19829\n1995,All stroke,22014,18192\n1995,Unintentional injuries,162160,55589\n1995,Suicides,106910,25800\n1996,Colorectal cancer,22145,16878\n1996,Lung cancer,68568,48953\n1996,Prostate cancer,8740,52363\n1996,Acute myocardial infarction,76980,24405\n1996,Cerebrovascular diseases,22680,19186\n1996,All stroke,20583,17743\n1996,Unintentional injuries,146442,50441\n1996,Suicides,101958,26638\n1997,Colorectal cancer,22375,16230\n1997,Lung cancer,67683,45710\n1997,Prostate cancer,8567,50903\n1997,Acute myocardial infarction,75102,22735\n1997,Cerebrovascular diseases,24558,20434\n1997,All stroke,22236,18684\n1997,Unintentional injuries,148627,50720\n1997,Suicides,95100,24088\n1998,Colorectal cancer,21345,17185\n1998,Lung cancer,69095,49668\n1998,Prostate cancer,8558,50393\n1998,Acute myocardial infarction,71618,20355\n1998,Cerebrovascular diseases,22561,19654\n1998,All stroke,20160,17487\n1998,Unintentional injuries,145751,49707\n1998,Suicides,95785,24575\n1999,Colorectal cancer,22950,15910\n1999,Lung cancer,71087,49443\n1999,Prostate cancer,8055,48605\n1999,Acute myocardial infarction,69195,20805\n1999,Cerebrovascular diseases,21353,18915\n1999,All stroke,18404,17110\n1999,Unintentional injuries,150019,53780\n1999,Suicides,104948,25768"
</script>
Upvotes: 1