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/quadrant-charts/quadrant-motion/data.json
4
anychart.data.loadJsonFile(
5
'https://cdn.anychart.com/samples/quadrant-charts/quadrant-motion/data.json',
6
function (data) {
7
var MONTHS = [
8
'Jan',
9
'Feb',
10
'Mar',
11
'Apr',
12
'May',
13
'June',
14
'July',
15
'Aug',
16
'Sep',
17
'Nov',
18
'Des',
19
'Jan'
20
];
21
22
$('#container').append(
23
'<div class="control-container"><span class="edge left">2015 Jan ' +
24
'<button id="playButton"><i class="ac ac-play" aria-hidden="true"></i></button></span>' +
25
'<input id="rangeInput" name="rangeInput" type="range" min="1" max="12" step="1" value="1">' +
26
'<span class="edge right">2016 Jan</span></div>'
27
);
28
var ri = $('#rangeInput');
29
var currentMonth = +ri[0].value;
30
ri.on('change', function () {
31
changeValue();
32
});
33
34
var bloggerData = anychart.data.set(data);
35
36
var lineMapping = [];
37
var markerMapping = [];
38
var NAMES = ['John', 'Jane', 'Mary', 'Angel', 'July', 'Rodrigo'];
39
40
// create dataset
41
lineMapping.push(
42
bloggerData.mapAs().filter('name', function (val) {
43
return val === 'John';
44
})
45
);
46
markerMapping.push(
47
bloggerData
48
.mapAs({
49
value: 'y',
50
fill: 'mfill',
51
stroke: 'mstroke',
52
label: 'mlabel'
53
})
54
.filter('name', function (val) {
55
return val === 'John';
56
})
57
);
58
lineMapping.push(
59
bloggerData.mapAs().filter('name', function (val) {
60
return val === 'Jane';
61
})
62
);
63
markerMapping.push(
64
bloggerData
65
.mapAs({
66
value: 'y',
67
fill: 'mfill',
68
stroke: 'mstroke',
69
label: 'mlabel'
70
})
71
.filter('name', function (val) {
72
return val === 'Jane';
73
})
74
);
75
lineMapping.push(
76
bloggerData.mapAs().filter('name', function (val) {
77
return val === 'Mary';
78
})
79
);
80
markerMapping.push(
81
bloggerData
82
.mapAs({
83
value: 'y',
84
fill: 'mfill',
85
stroke: 'mstroke',
86
label: 'mlabel'
87
})
88
.filter('name', function (val) {
89
return val === 'Mary';
90
})
91
);
92
lineMapping.push(
93
bloggerData.mapAs().filter('name', function (val) {
94
return val === 'Angel';
95
})
96
);
97
markerMapping.push(
98
bloggerData
99
.mapAs({
100
value: 'y',
101
fill: 'mfill',
102
stroke: 'mstroke',
103
label: 'mlabel'
104
})
105
.filter('name', function (val) {
106
return val === 'Angel';
107
})
108
);
109
lineMapping.push(
110
bloggerData.mapAs().filter('name', function (val) {
111
return val === 'July';
112
})
113
);
114
markerMapping.push(
115
bloggerData
116
.mapAs({
117
value: 'y',
118
fill: 'mfill',
119
stroke: 'mstroke',
120
label: 'mlabel'
121
})
122
.filter('name', function (val) {
123
return val === 'July';
124
})
125
);
126
lineMapping.push(
127
bloggerData.mapAs().filter('name', function (val) {
128
return val === 'Rodrigo';
129
})
130
);
131
markerMapping.push(
132
bloggerData
133
.mapAs({
134
value: 'y',
135
fill: 'mfill',
136
stroke: 'mstroke',
137
label: 'mlabel'
138
})
139
.filter('name', function (val) {
140
return val === 'Rodrigo';
141
})
142
);
143
144
// create quadrant chart
145
var chart = anychart.quadrant();
146
// set chart padding
147
chart.padding([10, 30, 70, 30]);
148
149
// set chart title text settings
150
chart
151
.title()
152
.enabled(true)
153
.useHtml(true)
154
.text('Blogger\'s Popularity Growth in 2015');
155
chart.legend(true);
156
157
// set scales settings
158
chart.yScale().minimum(0).maximum(5000);
159
chart.xScale().minimum(0).maximum(5000);
160
161
// set quarters settings
162
chart.quarters({
163
rightTop: {
164
fill: '#fff',
165
title: {
166
useHtml: true,
167
fontSize: 12,
168
lineHeight: 1.2,
169
text:
170
'Good for advertising<br><span style="color: #2d4053;">REALLY POPULAR</span>',
171
padding: 10
172
}
173
},
174
rightBottom: {
175
title: {
176
useHtml: true,
177
fontSize: 12,
178
lineHeight: 1.2,
179
text:
180
'Popular in particular group<br><span style="color: #2d4053;">LOCAL</span>',
181
padding: 10
182
}
183
},
184
leftTop: {
185
title: {
186
useHtml: true,
187
fontSize: 12,
188
lineHeight: 1.2,
189
text:
190
'Popular, but not interesting enough<br><span style="color: #2d4053;">ACTIVITY NEEDED</span>',
191
padding: 10
192
}
193
},
194
leftBottom: {
195
fill: '#fff',
196
title: {
197
useHtml: true,
198
fontSize: 12,
199
lineHeight: 1.2,
200
text:
201
'Bad for advertising<br><span style="color: #2d4053;">STARTERS</span>',
202
padding: 10
203
}
204
}
205
});
206
207
// create first label in the upper-left quarter
208
chart
209
.quarters()
210
.leftTop()
211
.label(0)
212
.enabled(true)
213
.useHtml(true)
214
.position('left-top')
215
.anchor('left-center')
216
.offsetY(-15)
217
.text('COMMENTS →');
218
219
// create first label in the lower-right quarter
220
chart
221
.quarters()
222
.rightBottom()
223
.label(0)
224
.enabled(true)
225
.useHtml(true)
226
.rotation(90)
227
.position('right-bottom')
228
.anchor('right-center')
229
.offsetX(-15)
230
.text('← FOLLOWERS');
231
232
// create series with data
233
var colors = '#f8bbd0 #f48fb1 #d4e157 #f2d1be #ffab00 #e1bee7'.split(
234
' '
235
);
236
for (var i = 0; i < 6; i++) {
237
chart
238
.line()
239
.data(lineMapping[i])
240
.labels(false)
241
.markers(false)
242
.tooltip(false)
243
.stroke('#CECECE')
244
.legendItem(null)
245
.hovered({ stroke: null })
246
.selected({ stroke: null });
247
248
chart
249
.marker()
250
.data(markerMapping[i])
251
.name(NAMES[i])
252
.zIndex(99)
253
.fill(colors[i])
254
.stroke('2 #fff')
255
.type('circle')
256
.size(4)
257
.selectionMode('none')
258
.legendItem({ iconType: 'circle' });
259
}
260
261
chart
262
.labels()
263
.fontFamily('Arial')
264
.position('right')
265
.fontColor('#0288d1')
266
.anchor('left-center')
267
.offsetX(5)
268
.offsetY(0)
269
.format(function () {
270
return MONTHS[this.getData('month') - 1];
271
});
272
273
chart
274
.tooltip()
275
.useHtml(true)
276
.titleFormat('{%Name}')
277
.format(function () {
278
var year = '2015 ';
279
if (this.getData('month') === 12) year = '2016 ';
280
return (
281
year +
282
MONTHS[this.getData('month') - 1] +
283
'<br/><span style="color: #cecece; font-size: 11px">' +
284
'Comments: </span>' +
285
this.getData('x') +
286
'<br/><span style="color: #cecece; font-size: 11px">' +
287
'Followers: </span>' +
288
this.getData('y')
289
);
290
});
291
292
// set chart container id
293
chart.container('container');
294
// initiate chart drawing
295
chart.draw();
296
297
var ifPlaying = false;
298
var monthPlaying = 2;
299
var interval;
300
$('#playButton').click(function () {
301
var $element = $('#playButton .ac');
302
if (ifPlaying) {
303
$element.prop('class', 'ac ac-play');
304
ifPlaying = false;
305
clearInterval(interval);
306
} else {
307
$element.prop('class', 'ac ac-stop');
308
ifPlaying = true;
309
interval = setInterval(function () {
310
$('#rangeInput').val(monthPlaying);
311
changeValue();
312
if (monthPlaying < 12) {
313
monthPlaying += 1;
314
} else {
315
monthPlaying = 1;
316
}
317
}, 500);
318
}
319
});
320
321
function changeValue() {
322
var newMonth = ri[0].value;
323
var mapping = bloggerData.mapAs();
324
var iter = mapping.getIterator();
325
while (iter.advance()) {
326
var month = iter.get('month');
327
if (month == currentMonth) {
328
mapping.set(iter.getIndex(), 'mfill', undefined);
329
mapping.set(iter.getIndex(), 'mstroke', undefined);
330
mapping.set(iter.getIndex(), 'mlabel', undefined);
331
} else if (month == newMonth) {
332
mapping.set(iter.getIndex(), 'mfill', '#0288d1');
333
mapping.set(iter.getIndex(), 'mstroke', '#0288d1');
334
mapping.set(iter.getIndex(), 'mlabel', { enabled: true });
335
}
336
}
337
currentMonth = newMonth;
338
chart.getSeriesAt(0).data(null).data(lineMapping[0]);
339
}
340
}
341
);
342
});