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
anychart.onDocumentReady(function () {
2
// The data used in this sample can be obtained from the CDN
3
// https://cdn.anychart.com/samples/maps-in-dashboard/sales-by-region/data.json
4
anychart.data.loadJsonFile(
5
'https://cdn.anychart.com/samples/maps-in-dashboard/sales-by-region/data.json',
6
function (data) {
7
var regionsData = data;
8
var selectedPoint;
9
var mapChart;
10
var revenueChart;
11
var totalShareChart;
12
var marketShareChart;
13
14
var drawMapChart = function () {
15
var map = anychart.map();
16
map.geoData('anychart.maps.france');
17
map
18
.title()
19
.enabled(true)
20
.useHtml(true)
21
.text(
22
'<span style="color: #212121;">Wine Sales by Region</span>'
23
)
24
.fontSize(18)
25
.padding([15, 0, 15, 0]);
26
27
var cr = map.colorRange();
28
cr.enabled(true).colorLineSize(10).padding([15, 0, 0, 0]);
29
cr.marker().size(7);
30
cr.ticks()
31
.enabled(true)
32
.position('center')
33
.length(10)
34
.stroke('2 #fff');
35
cr.labels().format(function () {
36
var range = this.colorRange;
37
var name;
38
if (isFinite(range.start + range.end)) {
39
name =
40
range.start.toLocaleString() +
41
' - ' +
42
range.end.toLocaleString();
43
} else if (isFinite(range.start)) {
44
name = '> ' + range.start.toLocaleString();
45
} else {
46
name = '< ' + range.end.toLocaleString();
47
}
48
return name;
49
});
50
cr.listen('mousedown', function (e) {
51
e.preventDefault();
52
e.stopPropagation();
53
});
54
55
var s1 = map.choropleth();
56
s1.geoIdField('id');
57
s1.labels(null);
58
var ocs = anychart.scales.ordinalColor([
59
{ less: 350000 },
60
{ from: 350000, to: 400000 },
61
{ from: 400000, to: 450000 },
62
{ from: 450000, to: 500000 },
63
{ from: 500000, to: 550000 },
64
{ greater: 550000 }
65
]);
66
ocs.colors([
67
'#ffd54f',
68
'#FDC543',
69
'#F9B033',
70
'#F7A028',
71
'#F28110',
72
'#ef6c00'
73
]);
74
s1.colorScale(ocs);
75
s1.hovered().fill('#1976d2 0.6');
76
s1.selected().fill('#1976d2');
77
s1.tooltip().title().fontSize(16);
78
s1.tooltip().titleFormat(function () {
79
return this.name;
80
});
81
s1.tooltip()
82
.useHtml(true)
83
.format(function () {
84
return (
85
'<span style="color:#d9d9d9">Revenue:</span> $' +
86
parseInt(this.value).toLocaleString()
87
);
88
});
89
map.padding(0, 30, 5, 0).margin(0);
90
map.getSeries(0).data(regionsData);
91
map.listen('pointsselect', function (e) {
92
selectedPoint = e.currentPoint;
93
if (selectedPoint) {
94
changeContents(selectedPoint.index);
95
}
96
});
97
return map;
98
};
99
100
var drawRevenueChart = function () {
101
var chart = anychart.column();
102
var s1 = anychart.scales.linear();
103
var s2 = anychart.scales.linear();
104
chart.padding([40, 0, 0, 0]);
105
chart.title().enabled(true).useHtml(true).padding([0, 0, 15, 0]);
106
chart.yAxis().scale(s1);
107
chart.yAxis().scale().minimum(0);
108
chart.yAxis(1).scale(s2);
109
chart.yAxis(1).scale().minimum(0);
110
var series = chart.column();
111
series.yScale(s1);
112
series.name('Revenue, $');
113
series.tooltip().title().fontSize(16);
114
series.tooltip().titleFormat(function () {
115
return this.x;
116
});
117
series
118
.tooltip()
119
.useHtml(true)
120
.format(function () {
121
return (
122
'<span style="color:#d9d9d9">Units sold:</span> ' +
123
parseInt(this.getData('value_2')).toLocaleString() +
124
'<br/><span style="color:#d9d9d9">Revenue:</span> $' +
125
parseInt(this.value).toLocaleString()
126
);
127
});
128
var series2 = chart.line();
129
series2.yScale(s2);
130
series2.name('Units sold');
131
series2.tooltip().title().fontSize(16);
132
series2.tooltip().titleFormat(function () {
133
return this.x;
134
});
135
series2
136
.tooltip()
137
.useHtml(true)
138
.format(function () {
139
return (
140
'<span style="color:#d9d9d9">Units sold:</span> ' +
141
parseInt(this.value).toLocaleString() +
142
'<br/><span style="color:#d9d9d9">Revenue:</span> $' +
143
parseInt(this.getData('value_2')).toLocaleString()
144
);
145
});
146
chart.interactivity('by-x');
147
chart.yAxis().orientation('left').title(null);
148
chart.yAxis(1).orientation('right').title(null);
149
chart.xAxis().title(null);
150
chart
151
.yAxis()
152
.labels()
153
.fontSize(11)
154
.format(function () {
155
return '$' + Math.abs(parseInt(this.value)).toLocaleString();
156
});
157
chart.yAxis(1).labels().padding(0, 0, 0, 5).fontSize(11);
158
chart.xAxis().labels().padding(5, 3, 0, 3).fontSize(11);
159
chart
160
.legend()
161
.position('center-bottom')
162
.enabled(true)
163
.tooltip(false)
164
.align('center')
165
.padding(10, 0, 0, 0);
166
chart.interactivity().selectionMode('none');
167
return chart;
168
};
169
170
function createSolidChart() {
171
var gauge = anychart.gauges.circular();
172
gauge.background(null);
173
gauge.fill(null);
174
gauge.stroke(null);
175
gauge.padding([30, 0, 0, 0]);
176
gauge.title().enabled(true).useHtml(true).padding([0, 0, 15, 0]);
177
var axis = gauge.axis().radius(70).width(1).fill(null);
178
axis
179
.scale()
180
.minimum(0)
181
.maximum(100)
182
.ticks({ interval: 1 })
183
.minorTicks({ interval: 1 });
184
axis.labels().enabled(false);
185
axis.ticks().enabled(false);
186
axis.minorTicks().enabled(false);
187
var stroke = '1 #e5e4e4';
188
gauge
189
.bar(0)
190
.dataIndex(0)
191
.radius(70)
192
.width(40)
193
.fill('#64b5f6')
194
.stroke(null)
195
.zIndex(5);
196
gauge
197
.bar(1)
198
.dataIndex(1)
199
.radius(70)
200
.width(40)
201
.fill('#F5F4F4')
202
.stroke(stroke)
203
.zIndex(4);
204
gauge
205
.label()
206
.text('')
207
.fontSize(20)
208
.hAlign('center')
209
.anchor('center')
210
.padding(0)
211
.zIndex(1);
212
return gauge;
213
}
214
215
var generalDataSet = anychart.data.set();
216
var firstMapping = generalDataSet.mapAs({
217
value: 1,
218
x: 0,
219
value_2: 2
220
});
221
var secondMapping = generalDataSet.mapAs({
222
value: 2,
223
x: 0,
224
value_2: 1
225
});
226
227
var changeContents = function (index) {
228
totalShareChart.data([regionsData[index].total_share, 100]);
229
totalShareChart
230
.label()
231
.text(regionsData[index].total_share + '%');
232
totalShareChart
233
.title()
234
.text(
235
'Shares ot Total<br/><span style="color: #212121; text-decoration: underline">' +
236
regionsData[index].x +
237
'</span>'
238
);
239
marketShareChart.data([regionsData[index].market_share, 100]);
240
marketShareChart
241
.label()
242
.text(regionsData[index].market_share + '%');
243
marketShareChart
244
.title()
245
.text(
246
'Market Share<br/><span style="color: #212121; text-decoration: underline">' +
247
regionsData[index].x +
248
'</span>'
249
);
250
generalDataSet.data(regionsData[index].revenue);
251
revenueChart.getSeries(0).data(firstMapping);
252
revenueChart.getSeries(1).data(secondMapping);
253
revenueChart
254
.title()
255
.text(
256
'Revenue Trend for <span style="color: #212121; text-decoration: underline">' +
257
regionsData[index].x +
258
'</span>'
259
);
260
};
261
mapChart = drawMapChart();
262
revenueChart = drawRevenueChart();
263
totalShareChart = createSolidChart();
264
marketShareChart = createSolidChart();
265
266
function fillInMainTable(flag) {
267
if (flag === 'wide') {
268
layoutTable.contents(
269
[
270
[mapChart, revenueChart, null],
271
[null, totalShareChart, marketShareChart]
272
],
273
true
274
);
275
layoutTable.getCell(0, 1).colSpan(2);
276
layoutTable.getCell(0, 0).rowSpan(3);
277
layoutTable.getCol(0).width('55%');
278
layoutTable.getRow(0).height(null);
279
} else {
280
layoutTable.contents(
281
[
282
[mapChart, null],
283
[revenueChart, null],
284
[totalShareChart, marketShareChart]
285
],
286
true
287
);
288
layoutTable.getCell(0, 0).colSpan(2);
289
layoutTable.getCell(1, 0).colSpan(2);
290
layoutTable.getCol(0).width(null);
291
layoutTable.getRow(0).height(400);
292
}
293
layoutTable.draw();
294
}
295
296
// Setting layout table
297
var layoutTable = anychart.standalones.table();
298
layoutTable.cellBorder(null);
299
layoutTable.container('container');
300
301
if (window.innerWidth > 768) fillInMainTable('wide');
302
else {
303
fillInMainTable('slim');
304
}
305
306
mapChart.getSeries(0).select(5);
307
changeContents(5);
308
// On resize changing layout to mobile version or conversely
309
window.onresize = function () {
310
if (layoutTable.colsCount() === 2 && window.innerWidth > 767) {
311
fillInMainTable('wide');
312
} else if (
313
layoutTable.colsCount() === 3 &&
314
window.innerWidth <= 767
315
) {
316
fillInMainTable('slim');
317
}
318
};
319
}
320
);
321
});