Skip to content

Instantly share code, notes, and snippets.

@CoreyBurkhart
Last active March 26, 2017 21:55
Show Gist options
  • Save CoreyBurkhart/a0ebc553f633f56f60eb208687513e1b to your computer and use it in GitHub Desktop.
Save CoreyBurkhart/a0ebc553f633f56f60eb208687513e1b to your computer and use it in GitHub Desktop.
Area Chart Reusable Pattern
license: mit
function areaChart() {
var width = 960,
height = 500,
margin = 50,
y = d3.scaleLinear(),
x = d3.scaleTime(),
yAxis = d3.axisLeft().ticks(10),
xAxis = d3.axisBottom().ticks(d3.timeYear.every(1)),
area = d3.area(d3.curveCardinal);
function chart(selection) {
selection.each(function(data, i) {
var svg = d3.select(this).append('svg')
.attr('width', width)
.attr('height', height);
console.log(svg.enter())
x.domain(d3.extent(data, function(d){return p2(d.time)}))
.rangeRound([margin, width - margin])
console.log(x.domain())
y.domain(d3.extent(data, function(d) {return d.nottem}))
.range([height - margin, margin])
area.x(function(d){ return x(p2(d.time));})
.y0(height - margin)
.y1(function(d) {
return y(d.nottem);
})
var startArea = d3.area()
.x(function(d){ return x(p2(d.time));})
.y0(height - margin)
.y1(height - margin - 1)
//get an array of color stops
var grad = Array(4).fill(5)
.map(function(d, i) {return (i+1) * 20})
//setup linear gradient prettiness
//i really should have put this in the html...
svg.append('defs')
.append('linearGradient')
.attr('id', 'gradient')
.attr('y1', 1)
.attr('y2', 0)
.attr('x1', 0)
.attr('x2', 0)
.selectAll('.stop')
.data(grad)
.enter()
.append('stop')
.attr('offset', function(d) {return d + '%'})
.attr('stop-color', function(d,i) {
return d3.interpolateCool(i/3)
})
.attr('stop-opacity', .8)
var t = d3.transition()
.duration(200)
.ease(d3.easeLinear)
//appending everything
var areaPath = svg.append('g')
.append('path')
.datum(data)
.style('fill', 'url(#gradient)')
.attr('d', startArea)
svg.append('g')
.call(xAxis.scale(x))
.attr('transform', `translate(0, ${height - margin})`)
.append('text')
.attr('class', 'label')
.attr('transform', `translate(${width - margin}, 30)`)
.text('YEAR')
svg.append('g')
.call(yAxis.scale(y))
.attr('transform', `translate(${margin}, 0)`)
.append('text')
.attr('class', 'label')
.attr('dy', -30)
.attr('dx', -30)
.style('transform', 'rotate(-90deg)')
.html('Average Temperature (°F)')
//load animation
window.setTimeout(function() {
areaPath.transition(t)
.attr('d', area)
}.bind(this), 1000)
})
}
/////////////////////////////////////////////////////////
// get/setters
chart.width = function(_) {
if(!arguments.length) return width;
width = _;
return chart;
}
chart.height = function(_) {
if(!arguments.length) return height;
height = _;
return chart;
}
chart.margin = function(_) {
if(!arguments.length) return margin;
margin = _;
return chart;
}
return chart;
}
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="areaChart.js"></script>
<style>
body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; }
.label {
fill: black;
text-transform: uppercase;
font-size: 13px;
}
</style>
</head>
<body>
<script>
var body = d3.select("body")
chart = areaChart(),
parseTime = d3.timeParse('%m, %Y'),
format = d3.timeFormat("%d-%b-%Y"),
p2 = d3.timeParse("%d-%b-%Y");
chart.width(+window.innerWidth)
.height(+window.innerHeight)
d3.csv('nottem.csv', function(d) {
//get the data in the right format (i can't possibly be doing this right...)
var time = d.time;
year = time.slice(0, 4)
//get the fraction of a year and convert to month as integer
month = Math.ceil(time.slice(4,7) * 12 + 1);
d.time = format(parseTime(month + ', ' + year))
d.nottem = +d.nottem;
return d;
}, function(err, data) {
if(err) throw new Error()
d3.select('body')
.datum(data)
.call(chart)
})
</script>
</body>
time nottem
1 1920 40.6
2 1920.08333333333 40.8
3 1920.16666666667 44.4
4 1920.25 46.7
5 1920.33333333333 54.1
6 1920.41666666667 58.5
7 1920.5 57.7
8 1920.58333333333 56.4
9 1920.66666666667 54.3
10 1920.75 50.5
11 1920.83333333333 42.9
12 1920.91666666667 39.8
13 1921 44.2
14 1921.08333333333 39.8
15 1921.16666666667 45.1
16 1921.25 47
17 1921.33333333333 54.1
18 1921.41666666667 58.7
19 1921.5 66.3
20 1921.58333333333 59.9
21 1921.66666666667 57
22 1921.75 54.2
23 1921.83333333333 39.7
24 1921.91666666667 42.8
25 1922 37.5
26 1922.08333333333 38.7
27 1922.16666666667 39.5
28 1922.25 42.1
29 1922.33333333333 55.7
30 1922.41666666667 57.8
31 1922.5 56.8
32 1922.58333333333 54.3
33 1922.66666666667 54.3
34 1922.75 47.1
35 1922.83333333333 41.8
36 1922.91666666667 41.7
37 1923 41.8
38 1923.08333333333 40.1
39 1923.16666666667 42.9
40 1923.25 45.8
41 1923.33333333333 49.2
42 1923.41666666667 52.7
43 1923.5 64.2
44 1923.58333333333 59.6
45 1923.66666666667 54.4
46 1923.75 49.2
47 1923.83333333333 36.3
48 1923.91666666667 37.6
49 1924 39.3
50 1924.08333333333 37.5
51 1924.16666666667 38.3
52 1924.25 45.5
53 1924.33333333333 53.2
54 1924.41666666667 57.7
55 1924.5 60.8
56 1924.58333333333 58.2
57 1924.66666666667 56.4
58 1924.75 49.8
59 1924.83333333333 44.4
60 1924.91666666667 43.6
61 1925 40
62 1925.08333333333 40.5
63 1925.16666666667 40.8
64 1925.25 45.1
65 1925.33333333333 53.8
66 1925.41666666667 59.4
67 1925.5 63.5
68 1925.58333333333 61
69 1925.66666666667 53
70 1925.75 50
71 1925.83333333333 38.1
72 1925.91666666667 36.3
73 1926 39.2
74 1926.08333333333 43.4
75 1926.16666666667 43.4
76 1926.25 48.9
77 1926.33333333333 50.6
78 1926.41666666667 56.8
79 1926.5 62.5
80 1926.58333333333 62
81 1926.66666666667 57.5
82 1926.75 46.7
83 1926.83333333333 41.6
84 1926.91666666667 39.8
85 1927 39.4
86 1927.08333333333 38.5
87 1927.16666666667 45.3
88 1927.25 47.1
89 1927.33333333333 51.7
90 1927.41666666667 55
91 1927.5 60.4
92 1927.58333333333 60.5
93 1927.66666666667 54.7
94 1927.75 50.3
95 1927.83333333333 42.3
96 1927.91666666667 35.2
97 1928 40.8
98 1928.08333333333 41.1
99 1928.16666666667 42.8
100 1928.25 47.3
101 1928.33333333333 50.9
102 1928.41666666667 56.4
103 1928.5 62.2
104 1928.58333333333 60.5
105 1928.66666666667 55.4
106 1928.75 50.2
107 1928.83333333333 43
108 1928.91666666667 37.3
109 1929 34.8
110 1929.08333333333 31.3
111 1929.16666666667 41
112 1929.25 43.9
113 1929.33333333333 53.1
114 1929.41666666667 56.9
115 1929.5 62.5
116 1929.58333333333 60.3
117 1929.66666666667 59.8
118 1929.75 49.2
119 1929.83333333333 42.9
120 1929.91666666667 41.9
121 1930 41.6
122 1930.08333333333 37.1
123 1930.16666666667 41.2
124 1930.25 46.9
125 1930.33333333333 51.2
126 1930.41666666667 60.4
127 1930.5 60.1
128 1930.58333333333 61.6
129 1930.66666666667 57
130 1930.75 50.9
131 1930.83333333333 43
132 1930.91666666667 38.8
133 1931 37.1
134 1931.08333333333 38.4
135 1931.16666666667 38.4
136 1931.25 46.5
137 1931.33333333333 53.5
138 1931.41666666667 58.4
139 1931.5 60.6
140 1931.58333333333 58.2
141 1931.66666666667 53.8
142 1931.75 46.6
143 1931.83333333333 45.5
144 1931.91666666667 40.6
145 1932 42.4
146 1932.08333333333 38.4
147 1932.16666666667 40.3
148 1932.25 44.6
149 1932.33333333333 50.9
150 1932.41666666667 57
151 1932.5 62.1
152 1932.58333333333 63.5
153 1932.66666666667 56.3
154 1932.75 47.3
155 1932.83333333333 43.6
156 1932.91666666667 41.8
157 1933 36.2
158 1933.08333333333 39.3
159 1933.16666666667 44.5
160 1933.25 48.7
161 1933.33333333333 54.2
162 1933.41666666667 60.8
163 1933.5 65.5
164 1933.58333333333 64.9
165 1933.66666666667 60.1
166 1933.75 50.2
167 1933.83333333333 42.1
168 1933.91666666667 35.8
169 1934 39.4
170 1934.08333333333 38.2
171 1934.16666666667 40.4
172 1934.25 46.9
173 1934.33333333333 53.4
174 1934.41666666667 59.6
175 1934.5 66.5
176 1934.58333333333 60.4
177 1934.66666666667 59.2
178 1934.75 51.2
179 1934.83333333333 42.8
180 1934.91666666667 45.8
181 1935 40
182 1935.08333333333 42.6
183 1935.16666666667 43.5
184 1935.25 47.1
185 1935.33333333333 50
186 1935.41666666667 60.5
187 1935.5 64.6
188 1935.58333333333 64
189 1935.66666666667 56.8
190 1935.75 48.6
191 1935.83333333333 44.2
192 1935.91666666667 36.4
193 1936 37.3
194 1936.08333333333 35
195 1936.16666666667 44
196 1936.25 43.9
197 1936.33333333333 52.7
198 1936.41666666667 58.6
199 1936.5 60
200 1936.58333333333 61.1
201 1936.66666666667 58.1
202 1936.75 49.6
203 1936.83333333333 41.6
204 1936.91666666667 41.3
205 1937 40.8
206 1937.08333333333 41
207 1937.16666666667 38.4
208 1937.25 47.4
209 1937.33333333333 54.1
210 1937.41666666667 58.6
211 1937.5 61.4
212 1937.58333333333 61.8
213 1937.66666666667 56.3
214 1937.75 50.9
215 1937.83333333333 41.4
216 1937.91666666667 37.1
217 1938 42.1
218 1938.08333333333 41.2
219 1938.16666666667 47.3
220 1938.25 46.6
221 1938.33333333333 52.4
222 1938.41666666667 59
223 1938.5 59.6
224 1938.58333333333 60.4
225 1938.66666666667 57
226 1938.75 50.7
227 1938.83333333333 47.8
228 1938.91666666667 39.2
229 1939 39.4
230 1939.08333333333 40.9
231 1939.16666666667 42.4
232 1939.25 47.8
233 1939.33333333333 52.4
234 1939.41666666667 58
235 1939.5 60.7
236 1939.58333333333 61.8
237 1939.66666666667 58.2
238 1939.75 46.7
239 1939.83333333333 46.6
240 1939.91666666667 37.8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment