-
Notifications
You must be signed in to change notification settings - Fork 35
/
11_bar_mouseover_js_filter.html
153 lines (127 loc) · 3.06 KB
/
11_bar_mouseover_js_filter.html
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>D3: Using filter() to apply highlights with JavaScript</title>
<script type="text/javascript" src="d3.js"></script>
<style type="text/css">
body {
background-color: gray;
}
svg {
background-color: white;
}
/* Commented out, as now we're handling fills with JS */
/*
svg rect {
fill: SteelBlue;
transition: fill 0.2s ease-in;
}
svg rect.highlight {
fill: DarkOrange;
}
svg rect:hover {
fill: Maroon;
}
*/
.axis path,
.axis line {
fill: none;
stroke: black;
shape-rendering: crispEdges;
}
.axis text {
font-family: sans-serif;
font-size: 11px;
}
</style>
</head>
<body>
<script type="text/javascript">
//Width, height, padding
var w = 600;
var h = 250;
var padding = 25;
//Array of dummy data values
var dataset = [ 5, 10, 13, 19, 21, 25, 22, 18, 15, 13,
11, 12, 15, 20, 18, 17, 16, 18, 23, 25 ];
//Configure x and y scale functions
var xScale = d3.scale.ordinal()
.domain(d3.range(dataset.length))
.rangeRoundBands([ padding, w - padding ], 0.05);
var yScale = d3.scale.linear()
.domain([ 0, d3.max(dataset) ])
.rangeRound([ h - padding, padding ]);
//Configure y axis generator
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left")
.ticks(5);
//Create SVG element
var svg = d3.select("body")
.append("svg")
.attr("width", w)
.attr("height", h);
//Create bars
var rects = svg.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("x", function(d, i) {
return xScale(i);
})
.attr("y", function(d) {
return h - padding;
})
.attr("width", xScale.rangeBand())
.attr("height", 0)
.attr("fill", "SteelBlue") //Setting initial fill
.on("mouseover", function() {
//Update fill on mouseover
d3.select(this)
.attr("fill", "Maroon");
})
.on("mouseout", function() {
//Update fill on mouseout
d3.select(this)
.attr("fill", function(d) {
if (d > 20) {
return "DarkOrange";
}
return "SteelBlue";
});
});
//Transition rects into place
rects.transition()
.delay(function(d, i) {
return i * 100;
})
.duration(1500)
.attr("y", function(d) {
return yScale(d);
})
.attr("height", function(d) {
return h - padding - yScale(d);
})
.filter(function(d) { //We can filter a transition selection!
if (d > 20) {
return true;
}
return false;
})
.attr("fill", "DarkOrange"); //This is part of the same transition
//above, but only applies to elements
//that meet our criteria in the filter.
//Create y axis
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(" + padding + ",0)")
.attr("opacity", 0)
.call(yAxis)
.transition()
.delay(2000)
.duration(1500)
.attr("opacity", 1.0);
</script>
</body>
</html>