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