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

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);