forked from h5p/h5p-chart
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbar.js
134 lines (113 loc) · 3.42 KB
/
bar.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*global d3*/
H5P.Chart.BarChart = (function () {
/**
* Creates a bar chart from the given data set.
*
* @class
* @param {array} params from semantics, contains data set
* @param {H5P.jQuery} $wrapper
*/
function BarChart(params, $wrapper) {
var self = this;
var dataSet = params.listOfTypes;
var defColors = d3.scale.ordinal()
.range(["#90EE90", "#ADD8E6", "#FFB6C1", "#B0C4DE", "#D3D3D3", "#20B2AA", "#FAFAD2"]);
// Create scales for bars
var xScale = d3.scale.ordinal()
.domain(d3.range(dataSet.length));
var yScale = d3.scale.linear()
.domain([0, d3.max(dataSet, function (d) {
return d.value;
})]);
var x = d3.time.scale();
var y = d3.scale.linear();
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom")
.tickFormat(function (d) {
return dataSet[d % dataSet.length].text;
});
// Create SVG element
var svg = d3.select($wrapper[0])
.append("svg");
svg.append("desc").html("chart");
// Create x axis
var xAxisG = svg.append("g")
.attr("class", "x-axis");
/**
* @private
*/
var key = function (d) {
return dataSet.indexOf(d);
};
// Create rectangles for bars
var rects = svg.selectAll("rect")
.data(dataSet, key)
.enter()
.append("rect")
.attr("fill", function(d) {
if (d.color !== undefined) {
return d.color;
}
return defColors(dataSet.indexOf(d) % 7);
});
// Create labels
var texts = svg.selectAll("text")
.data(dataSet, key)
.enter()
.append("text")
.text(function(d) {
return d.value;
})
.attr("text-anchor", "middle")
.attr("fill", function (d) {
if (d.fontColor !== undefined) {
return d.fontColor;
}
return '000000';
})
.attr("aria-hidden", true);
/**
* Fit the current bar chart to the size of the wrapper.
*/
self.resize = function () {
// Always scale to available space
var style = window.getComputedStyle($wrapper[0]);
var width = parseFloat(style.width);
var h = parseFloat(style.height);
var fontSize = parseFloat(style.fontSize);
var lineHeight = (1.25 * fontSize);
var tickSize = (fontSize * 0.125);
var height = h - tickSize - lineHeight; // Add space for labels below
// Update SVG size
svg.attr("width", width)
.attr("height", h);
// Update scales
xScale.rangeRoundBands([0, width], 0.05);
yScale.range([0, height]);
x.range([0, width]);
y.range([height, 0]);
xAxis.tickSize([tickSize]);
xAxisG.attr("transform", "translate(0," + height + ")")
.call(xAxis);
// Move rectangles (bars)
rects.attr("x", function(d, i) {
return xScale(i);
}).attr("y", function(d) {
return height - yScale(d.value);
}).attr("width", xScale.rangeBand())
.attr("height", function(d) {
return yScale(d.value);
});
// Re-locate text value labels
texts.attr("x", function(d, i) {
return xScale(i) + xScale.rangeBand() / 2;
}).attr("y", function(d) {
return height - yScale(d.value) + lineHeight;
});
// Hide ticks from readspeakers, the entire rectangle is already labelled
xAxisG.selectAll("text").attr("aria-hidden", true);
};
}
return BarChart;
})();