HTMLcopy
1
<div id="container"></div>
CSScopy
8
1
html,
2
body,
3
#container {
4
width: 100%;
5
height: 100%;
6
margin: 0;
7
padding: 0;
8
}
JavaScriptcopy
x
1
var stage;
2
var map;
3
var chart;
4
var data;
5
var mapData;
6
var globData;
7
var nHemData;
8
var sHemData;
9
var colorScale;
10
var selected = NaN;
11
var hovered = NaN;
12
13
anychart.onDocumentReady(function () {
14
setup();
15
stage.resume();
16
});
17
18
function setupTrendChart() {
19
chart = anychart.area();
20
21
chart.credits(true);
22
chart
23
.credits()
24
.url('https://www.coursera.org/course/datavisualization');
25
chart
26
.credits()
27
.text(
28
'Special for: https://www.coursera.org/course/datavisualization'
29
);
30
chart
31
.credits()
32
.logoSrc(
33
'https://d3njjcbhbojbot.cloudfront.net/web/images/favicons/icon-blue-32x32.png'
34
);
35
chart.interactivity().hoverMode('by-x');
36
37
var tooltipFormatter = function (info) {
38
return (
39
'<span style="color: #bebebe;">Global: </span>' +
40
info.getData('glob').toFixed(2) +
41
String.fromCharCode(176) +
42
'C<br/>' +
43
'<span style="color: #bebebe;">Northern Hem.: </span>' +
44
info.getData('nHem').toFixed(2) +
45
String.fromCharCode(176) +
46
'C<br/>' +
47
'<span style="color: #bebebe;">Southern Hem.: </span>' +
48
info.getData('sHem').toFixed(2) +
49
String.fromCharCode(176) +
50
'C'
51
);
52
};
53
54
var series;
55
56
series = chart.area(globData);
57
series
58
.clip(false)
59
.name('Global mean')
60
.fill('#4fc3f7 0.6')
61
.stroke('2 #4fc3f7')
62
.markers({ enabled: false, zIndex: 100 })
63
.tooltip({
64
format: function (info) {
65
return tooltipFormatter(info);
66
},
67
titleFormat: function (info) {
68
return info.x;
69
},
70
useHtml: true
71
});
72
series.hovered().markers({ size: 4 });
73
74
series = chart.line(nHemData);
75
series
76
.clip(false)
77
.name('Northen Hem.')
78
.stroke('2 #f06292')
79
.tooltip({
80
format: function (info) {
81
return tooltipFormatter(info);
82
},
83
titleFormat: function (info) {
84
return info.x;
85
},
86
useHtml: true
87
});
88
series.hovered().markers({ size: 4 });
89
90
series = chart.line(sHemData);
91
series
92
.clip(false)
93
.name('Sourthen Hem.')
94
.stroke('2 #c2185b')
95
.tooltip({
96
format: function (info) {
97
return tooltipFormatter(info);
98
},
99
titleFormat: function (info) {
100
return info.x;
101
},
102
useHtml: true
103
});
104
series.hovered().markers({ size: 4 });
105
106
chart.padding().right(chart.padding().right() + 10);
107
chart.legend().enabled(true).position('center-bottom');
108
chart.xScale().ticks().interval(10);
109
chart.yAxis().labels().format(labelFormatter);
110
chart.yAxis().title('Temperature, ' + String.fromCharCode(176) + 'C');
111
chart
112
.xAxis()
113
.labels()
114
.format(function (info) {
115
return info.value + 's';
116
});
117
chart
118
.crosshair()
119
.enabled(true)
120
.yStroke(null)
121
.xLabel(false)
122
.yLabel(false);
123
chart.listen('pointclick', chartPointClick);
124
chart.listen('pointmouseover', chartPointHover);
125
chart.listen('pointmousemove', chartPointHover);
126
chart.listen('pointmouseout', chartPointUnhover);
127
return chart;
128
}
129
130
function setupMap() {
131
map = anychart.map();
132
map.geoData('anychart.maps.world');
133
map.credits(false);
134
map
135
.legend()
136
.useHtml(true)
137
.enabled(true)
138
.itemsLayout('vertical')
139
.position('right')
140
.inverted(true)
141
.align('top')
142
.width(200)
143
.itemsSpacing(10)
144
.title()
145
.enabled(true)
146
.hAlign('left')
147
.align('left')
148
.useHtml(true)
149
.padding()
150
.bottom(10);
151
map.unboundRegions().stroke('#fff');
152
return map;
153
}
154
155
function setup() {
156
colorScale = anychart.scales.linearColor({
157
keys: ['#304ffe', '#03a9f4', '#81d4fa', '#f48fb1', '#c2185b']
158
});
159
colorScale.ticks().set([]);
160
prepareData();
161
stage = anychart.graphics.create('container');
162
stage.suspend();
163
164
var title = anychart.standalones.title();
165
title.text('World Land-Ocean Temperature Trend For The Last 35 Years');
166
title.vAlign('bottom');
167
title.height('5%');
168
title.container(stage);
169
title.draw();
170
171
map = setupMap();
172
map.top('5%');
173
map.height('55%');
174
map.container(stage);
175
map.draw();
176
177
chart = setupTrendChart();
178
chart.top('60%');
179
chart.container(stage);
180
chart.draw();
181
colorizeMap();
182
183
stage.listen('stageresize', colorizeMap);
184
}
185
186
function chartPointClick(e) {
187
var index = e.pointIndex;
188
if (selected === index) return;
189
var row = data.row(selected);
190
markSelected(row, false);
191
data.row(selected, row);
192
row = data.row(index);
193
selected = index;
194
markSelected(row, true);
195
data.row(index, row);
196
colorizeMap();
197
}
198
199
function chartPointHover(e) {
200
var index = e.pointIndex;
201
if (hovered === index) return;
202
hovered = index;
203
colorizeMap();
204
}
205
206
function chartPointUnhover() {
207
hovered = NaN;
208
colorizeMap();
209
}
210
211
function markSelected(row, isSelected) {
212
if (isSelected) {
213
var selectedMarker = {
214
enabled: true,
215
stroke: 'null',
216
type: 'star5',
217
size: 8
218
};
219
var selectedHoverMarker = {
220
size: 8
221
};
222
var selectedLabel = {
223
enabled: true
224
};
225
row[12] = selectedMarker;
226
row[13] = selectedHoverMarker;
227
row[14] = selectedLabel;
228
} else {
229
delete row[12];
230
delete row[13];
231
delete row[14];
232
}
233
}
234
235
function labelFormatter(info) {
236
if ('tickValue' in info) {
237
info.tickValue.toFixed(2);
238
} else if ('rawValue' in info) {
239
info.rawValue.toFixed(2);
240
} else {
241
info.value.toFixed(2);
242
}
243
}
244
245
function colorizeMap() {
246
var southEndReal = -55.98;
247
var northEndReal = 83.6275;
248
249
var net = [-90, -64, -44, -24, 0, 24, 44, 64, 90];
250
var offsets = net.map(function (val) {
251
return (val - southEndReal) / (northEndReal - southEndReal);
252
});
253
var regions = ['s4', 's3', 's2', 's1', 'n1', 'n2', 'n3', 'n4'];
254
var names = [
255
'90S-64S',
256
'64S-44S',
257
'44S-24S',
258
'24S-Equator',
259
'Equator-24N',
260
'24N-44N',
261
'44N-64N',
262
'64N-90N'
263
];
264
265
var iter = mapData.getIterator();
266
iter.select(isNaN(hovered) ? selected : hovered);
267
var keys = [];
268
var i;
269
var val;
270
var items = [];
271
272
for (i = 2; i < offsets.length; i++) {
273
var region = regions[i - 1];
274
val = iter.get(region);
275
var offset1 = Math.min(1, Math.max(0, offsets[i - 1] + 0.0001));
276
keys.push({
277
offset: offset1,
278
color: colorScale.valueToColor(val)
279
});
280
var offset2 = Math.min(1, Math.max(0, offsets[i]));
281
keys.push({
282
offset: offset2,
283
color: colorScale.valueToColor(val)
284
});
285
286
items.push({
287
iconFill: colorScale.valueToColor(val),
288
text:
289
names[i - 1] +
290
': <span style="color: #212121; font-size: 12px;">' +
291
val.toFixed(2) +
292
String.fromCharCode(176) +
293
'C</span>'
294
});
295
}
296
297
map.legend().items(items).fontSize(12);
298
map
299
.legend()
300
.paginator(false)
301
.title()
302
.text(
303
'<span style="font-weight: bold">' +
304
iter.get('x') +
305
'</span><br/>' +
306
'<span style="font-size: 12px;">Global: <span style="color: #212121;">' +
307
iter.get('glob') +
308
String.fromCharCode(176) +
309
'C</span></span><br/>' +
310
'<span style="font-size: 12px; color: #f06292">Northern Hem.: <span style="color: #212121;">' +
311
iter.get('nHem') +
312
String.fromCharCode(176) +
313
'C</span></span><br/>' +
314
'<span style="font-size: 12px; color: #c2185b">Southern Hem.: <span style="color: #212121;">' +
315
iter.get('sHem') +
316
String.fromCharCode(176) +
317
'C</span></span>'
318
);
319
320
var gradient = {
321
keys: keys,
322
mode: map.getPixelBounds(),
323
angle: 90
324
};
325
map.unboundRegions().fill(gradient);
326
}
327
328
function prepareData() {
329
// The data used in this sample can be obtained from the CDN
330
// https://cdn.anychart.com/samples/maps-in-dashboard/world-temperature/data.js
331
var rawData = anychart.data
332
// eslint-disable-next-line no-undef
333
.set(getData(), {
334
rowsSeparator: '\n',
335
colsSeparator: ',',
336
ignoreFirstRow: true
337
})
338
.mapAs({
339
x: 0,
340
glob: 1,
341
nHem: 2,
342
sHem: 3,
343
n4: 7,
344
n3: 8,
345
n2: 9,
346
n1: 10,
347
s1: 11,
348
s2: 12,
349
s3: 13,
350
s4: 14
351
});
352
353
var arr = [];
354
var iterator = rawData.getIterator().reset();
355
var min = Infinity;
356
var max = -Infinity;
357
while (iterator.advance()) {
358
var row = [
359
+iterator.get('x'),
360
+iterator.get('glob') / 100 + 14,
361
+iterator.get('n4') / 100 + 14,
362
+iterator.get('n3') / 100 + 14,
363
+iterator.get('n2') / 100 + 14,
364
+iterator.get('n1') / 100 + 14,
365
+iterator.get('s1') / 100 + 14,
366
+iterator.get('s2') / 100 + 14,
367
+iterator.get('s3') / 100 + 14,
368
+iterator.get('s4') / 100 + 14,
369
+iterator.get('nHem') / 100 + 14,
370
+iterator.get('sHem') / 100 + 14
371
];
372
for (var i = 1; i < row.length; i++) {
373
min = Math.min(min, row[i]);
374
max = Math.max(max, row[i]);
375
}
376
arr.push(row);
377
}
378
colorScale.minimum(min);
379
colorScale.maximum(max);
380
381
selected = arr.length - 1;
382
markSelected(arr[selected], true);
383
384
data = anychart.data.set(arr);
385
globData = data.mapAs({
386
x: 0,
387
value: 1,
388
glob: 1,
389
marker: 12,
390
hoverMarker: 13,
391
nHem: 10,
392
sHem: 11
393
});
394
nHemData = data.mapAs({
395
x: 0,
396
value: 10,
397
glob: 1,
398
marker: 12,
399
hoverMarker: 13,
400
nHem: 10,
401
sHem: 11
402
});
403
sHemData = data.mapAs({
404
x: 0,
405
value: 11,
406
glob: 1,
407
marker: 12,
408
hoverMarker: 13,
409
nHem: 10,
410
sHem: 11
411
});
412
mapData = data.mapAs({
413
x: 0,
414
glob: 1,
415
n4: 2,
416
n3: 3,
417
n2: 4,
418
n1: 5,
419
s1: 6,
420
s2: 7,
421
s3: 8,
422
s4: 9,
423
nHem: 10,
424
sHem: 11
425
});
426
}