You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.3 KiB
134 lines
3.3 KiB
9 months ago
|
/*
|
||
|
|
||
|
Highcharts funnel module, Beta
|
||
|
|
||
|
(c) 2010-2012 Torstein Hønsi
|
||
|
|
||
|
License: www.highcharts.com/license
|
||
|
*/
|
||
|
(function (d) {
|
||
|
var u = d.getOptions().plotOptions,
|
||
|
p = d.seriesTypes,
|
||
|
D = d.merge,
|
||
|
z = function () {},
|
||
|
A = d.each;
|
||
|
u.funnel = D(u.pie, {
|
||
|
center: ['50%', '50%'],
|
||
|
width: '90%',
|
||
|
neckWidth: '30%',
|
||
|
height: '100%',
|
||
|
neckHeight: '25%',
|
||
|
dataLabels: { connectorWidth: 1, connectorColor: '#606060' },
|
||
|
size: !0,
|
||
|
states: { select: { color: '#C0C0C0', borderColor: '#000000', shadow: !1 } },
|
||
|
});
|
||
|
p.funnel = d.extendClass(p.pie, {
|
||
|
type: 'funnel',
|
||
|
animate: z,
|
||
|
translate: function () {
|
||
|
var a = function (k, a) {
|
||
|
return /%$/.test(k) ? (a * parseInt(k, 10)) / 100 : parseInt(k, 10);
|
||
|
},
|
||
|
g = 0,
|
||
|
e = this.chart,
|
||
|
f = e.plotWidth,
|
||
|
e = e.plotHeight,
|
||
|
h = 0,
|
||
|
c = this.options,
|
||
|
C = c.center,
|
||
|
b = a(C[0], f),
|
||
|
d = a(C[0], e),
|
||
|
p = a(c.width, f),
|
||
|
i,
|
||
|
q,
|
||
|
j = a(c.height, e),
|
||
|
r = a(c.neckWidth, f),
|
||
|
s = a(c.neckHeight, e),
|
||
|
v = j - s,
|
||
|
a = this.data,
|
||
|
w,
|
||
|
x,
|
||
|
u = c.dataLabels.position === 'left' ? 1 : 0,
|
||
|
y,
|
||
|
m,
|
||
|
B,
|
||
|
n,
|
||
|
l,
|
||
|
t,
|
||
|
o;
|
||
|
this.getWidthAt = q = function (k) {
|
||
|
return k > j - s || j === s ? r : r + (p - r) * ((j - s - k) / (j - s));
|
||
|
};
|
||
|
this.getX = function (k, a) {
|
||
|
return b + (a ? -1 : 1) * (q(k) / 2 + c.dataLabels.distance);
|
||
|
};
|
||
|
this.center = [b, d, j];
|
||
|
this.centerX = b;
|
||
|
A(a, function (a) {
|
||
|
g += a.y;
|
||
|
});
|
||
|
A(a, function (a) {
|
||
|
o = null;
|
||
|
x = g ? a.y / g : 0;
|
||
|
m = d - j / 2 + h * j;
|
||
|
l = m + x * j;
|
||
|
i = q(m);
|
||
|
y = b - i / 2;
|
||
|
B = y + i;
|
||
|
i = q(l);
|
||
|
n = b - i / 2;
|
||
|
t = n + i;
|
||
|
m > v
|
||
|
? ((y = n = b - r / 2), (B = t = b + r / 2))
|
||
|
: l > v && ((o = l), (i = q(v)), (n = b - i / 2), (t = n + i), (l = v));
|
||
|
w = ['M', y, m, 'L', B, m, t, l];
|
||
|
o && w.push(t, o, n, o);
|
||
|
w.push(n, l, 'Z');
|
||
|
a.shapeType = 'path';
|
||
|
a.shapeArgs = { d: w };
|
||
|
a.percentage = x * 100;
|
||
|
a.plotX = b;
|
||
|
a.plotY = (m + (o || l)) / 2;
|
||
|
a.tooltipPos = [b, a.plotY];
|
||
|
a.slice = z;
|
||
|
a.half = u;
|
||
|
h += x;
|
||
|
});
|
||
|
this.setTooltipPoints();
|
||
|
},
|
||
|
drawPoints: function () {
|
||
|
var a = this,
|
||
|
g = a.options,
|
||
|
e = a.chart.renderer;
|
||
|
A(a.data, function (f) {
|
||
|
var h = f.graphic,
|
||
|
c = f.shapeArgs;
|
||
|
h
|
||
|
? h.animate(c)
|
||
|
: (f.graphic = e
|
||
|
.path(c)
|
||
|
.attr({ fill: f.color, stroke: g.borderColor, 'stroke-width': g.borderWidth })
|
||
|
.add(a.group));
|
||
|
});
|
||
|
},
|
||
|
sortByAngle: z,
|
||
|
drawDataLabels: function () {
|
||
|
var a = this.data,
|
||
|
g = this.options.dataLabels.distance,
|
||
|
e,
|
||
|
f,
|
||
|
h,
|
||
|
c = a.length,
|
||
|
d,
|
||
|
b;
|
||
|
for (this.center[2] -= 2 * g; c--; )
|
||
|
(h = a[c]),
|
||
|
(f = (e = h.half) ? 1 : -1),
|
||
|
(b = h.plotY),
|
||
|
(d = this.getX(b, e)),
|
||
|
(h.labelPos = [0, b, d + (g - 5) * f, b, d + g * f, b, e ? 'right' : 'left', 0]);
|
||
|
p.pie.prototype.drawDataLabels.call(this);
|
||
|
},
|
||
|
});
|
||
|
})(Highcharts);
|