highcharts
Version:
JavaScript charting framework
11 lines • 13.5 kB
JavaScript
/**
* Highcharts JS v13.0.1 (2026-08-17)
* @module highcharts/modules/venn
* @requires highcharts
*
* (c) 2017-2026 Highsoft AS
* Authors: Jon Arild Nygård
*
* A commercial license may be required depending on use,
* see www.highcharts.com/license
*/import*as e from"../highcharts.js";let t={};t.n=e=>{let r=e&&e.__esModule?()=>e.default:()=>e;return t.d(r,{a:r}),r},t.d=(e,r)=>{if(Array.isArray(r))for(var n=0;n<r.length;){var i=r[n++],s=r[n++];t.o(e,i)?0===s&&n++:0===s?Object.defineProperty(e,i,{enumerable:!0,value:r[n++]}):Object.defineProperty(e,i,{enumerable:!0,get:s})}else for(var i in r)t.o(r,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:r[i]})},t.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);let r=e.default;var n,i,s,l=t.n(r);let o=e.default.Color;var a=t.n(o);(n=i||(i={})).getCenterOfPoints=function(e){let t=e.reduce((e,t)=>(e.x+=t.x,e.y+=t.y,e),{x:0,y:0});return{x:t.x/e.length,y:t.y/e.length}},n.getDistanceBetweenPoints=function(e,t){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))},n.getAngleBetweenPoints=function(e,t){return Math.atan2(t.x-e.x,t.y-e.y)},n.pointInPolygon=function({x:e,y:t},r){let n=r.length,i,s,l=!1;for(i=0,s=n-1;i<n;s=i++){let[n,o]=r[i],[a,u]=r[s];o>t!=u>t&&e<(a-n)*(t-o)/(u-o)+n&&(l=!l)}return l};let u=i,{getAngleBetweenPoints:c,getCenterOfPoints:f,getDistanceBetweenPoints:h}=u;!function(e){function t(e,t){let r=Math.pow(10,t);return Math.round(e*r)/r}function n(e){if(e<=0)throw Error("radius of circle must be a positive number.");return(0,r.correctFloat)(Math.PI*e*e)}function i(e,t){return e*e*Math.acos(1-t/e)-(e-t)*Math.sqrt(t*(2*e-t))}function s(e,r){let n=h(e,r),i=e.r,s=r.r,l=[];if(n<i+s&&n>Math.abs(i-s)){let o=i*i,a=(o-s*s+n*n)/(2*n),u=Math.sqrt(o-a*a),c=e.x,f=r.x,h=e.y,p=r.y,d=c+a*(f-c)/n,g=h+a*(p-h)/n,y=-(u/n*(p-h)),x=-(u/n*(f-c));l=[{x:t(d+y,14),y:t(g-x,14)},{x:t(d-y,14),y:t(g+x,14)}]}return l}function l(e){return e.reduce((e,t,r,n)=>{let i=n.slice(r+1).reduce((e,n,i)=>{let l=[r,i+r+1];return e.concat(s(t,n).map(e=>(e.indexes=l,e)))},[]);return e.concat(i)},[])}function o(e,t){return h(e,t)<=t.r+1e-10}function a(e,t){return!t.some(function(t){return!o(e,t)})}function u(e){return l(e).filter(function(t){return a(t,e)})}e.round=t,e.getAreaOfCircle=n,e.getCircularSegmentArea=i,e.getOverlapBetweenCircles=function(e,r,s){let l=0;if(s<e+r){if(s<=Math.abs(r-e))l=n(e<r?e:r);else{let t=(e*e-r*r+s*s)/(2*s);l=i(e,e-t)+i(r,r-(s-t))}l=t(l,14)}return l},e.getCircleCircleIntersection=s,e.getCirclesIntersectionPoints=l,e.isCircle1CompletelyOverlappingCircle2=function(e,t){return h(e,t)+t.r<e.r+1e-10},e.isPointInsideCircle=o,e.isPointInsideAllCircles=a,e.isPointOutsideAllCircles=function(e,t){return!t.some(function(t){return o(e,t)})},e.getCirclesIntersectionPolygon=u,e.getAreaOfIntersectionBetweenCircles=function(e){let t=u(e),r;if(t.length>1){let n=f(t),i=(t=t.map(function(e){return e.angle=c(n,e),e}).sort(function(e,t){return t.angle-e.angle}))[t.length-1],s=t.reduce(function(t,r){let{startPoint:n}=t,i=f([n,r]),s=r.indexes.filter(function(e){return n.indexes.indexOf(e)>-1}).reduce(function(t,s){let l=e[s],o=c(l,r),a=c(l,n),u=a-o+(a<o?2*Math.PI:0),f=a-u/2,p=h(i,{x:l.x+l.r*Math.sin(f),y:l.y+l.r*Math.cos(f)}),{r:d}=l;return p>2*d&&(p=2*d),(!t||t.width>p)&&(t={r:d,largeArc:+(p>d),width:p,x:r.x,y:r.y}),t},null);if(s){let{r:e}=s;t.arcs.push(["A",e,e,0,s.largeArc,1,s.x,s.y]),t.startPoint=r}return t},{startPoint:i,arcs:[]}).arcs;0===s.length||1===s.length||(s.unshift(["M",i.x,i.y]),r={center:n,d:s})}return r}}(s||(s={}));let p=s,d=function(e,t){let{animatableAttribs:r,onComplete:n,css:i,renderer:s}=t,l=e.series&&e.series.chart.hasRendered?void 0:e.series&&e.series.options.animation,o=e.graphic;if(t.attribs={...t.attribs,class:e.getClassName()},e.shouldDraw())o||(e.graphic=o="text"===t.shapeType?s.text():"image"===t.shapeType?s.image(t.imageUrl||"").attr(t.shapeArgs||{}):s[t.shapeType](t.shapeArgs||{}),o.add(t.group)),i&&o.css(i),o.attr(t.attribs).animate(r,!t.isNew&&l,n);else if(o){let t=()=>{e.graphic=o=o&&o.destroy(),"function"==typeof n&&n()};Object.keys(r).length?o.animate(r,void 0,()=>t()):t()}},g=e.default.SeriesRegistry;var y=t.n(g);let{scatter:{prototype:{pointClass:x}}}=y().seriesTypes,m=class extends x{isValid(){return(0,r.isNumber)(this.value)}shouldDraw(){return!!this.shapeArgs}},{getAreaOfCircle:b,getCircleCircleIntersection:v,getOverlapBetweenCircles:A,isPointInsideAllCircles:O,isPointInsideCircle:M,isPointOutsideAllCircles:C}=p,{getDistanceBetweenPoints:P}=u;function w(e){let t={};return e.filter(e=>2===e.sets.length).forEach(e=>{e.sets.forEach((n,i,s)=>{(0,r.isObject)(t[n])||(t[n]={totalOverlap:0,overlapping:{}}),t[n]={totalOverlap:(t[n].totalOverlap||0)+e.value,overlapping:{...t[n].overlapping||{},[s[1-i]]:e.value}}})}),e.filter(I).forEach(e=>{let n=t[e.sets[0]];(0,r.extend)(e,n)}),e}function N(e,t,r,n,i){let s=e(t),l=e(r),o=i||100,a=n||1e-10,u=r-t,c,f,h=1;if(t>=r)throw Error("a must be smaller than b.");if(s*l>0)throw Error("f(a) and f(b) must have opposite signs.");if(0===s)c=t;else if(0===l)c=r;else for(;h++<=o&&0!==f&&u>a;)u=(r-t)/2,s*(f=e(c=t+u))>0?t=c:r=c;return c}function j(e){let t=e.slice(0,-1),r=t.length,n=[],i=(e,t)=>(e.sum+=t[e.i],e);for(let e=0;e<r;e++)n[e]=t.reduce(i,{sum:0,i:e}).sum/r;return n}function E(e,t,r){let n=e+t;return r<=0?n:b(e<t?e:t)<=r?0:N(n=>r-A(e,t,n),0,n)}function I(e){return(0,r.isArray)(e.sets)&&1===e.sets.length}function L(e){let t={};return(0,r.isObject)(e)&&(0,r.isNumber)(e.value)&&e.value>-1&&(0,r.isArray)(e.sets)&&e.sets.length>0&&!e.sets.some(function(e){let n=!1;return!t[e]&&(0,r.isString)(e)?t[e]=!0:n=!0,n})}function T(e,t){return t.reduce(function(t,r){let n=0;if(r.sets.length>1){let t=r.value-function(e){let t=0;if(2===e.length){let r=e[0],n=e[1];t=A(r.r,n.r,P(r,n))}return t}(r.sets.map(function(t){return e[t]}));n=Math.round(t*t*1e11)/1e11}return t+n},0)}function V(e,t){return void 0!==t.totalOverlap&&void 0!==e.totalOverlap?t.totalOverlap-e.totalOverlap:NaN}let S={geometry:u,geometryCircles:p,addOverlapToSets:w,getCentroid:j,getDistanceBetweenCirclesByOverlap:E,getLabelWidth:function(e,t,r){let n=t.reduce((e,t)=>Math.min(t.r,e),1/0),i=r.filter(t=>!M(e,t)),s=function(r,n){return N(s=>{let l={x:e.x+n*s,y:e.y};return-(r-s)+(O(l,t)&&C(l,i)?0:Number.MAX_VALUE)},0,r)};return 2*Math.min(s(n,-1),s(n,1))},getMarginFromCircles:function(e,t,r){let n=t.reduce((t,r)=>{let n=r.r-P(e,r);return n<=t?n:t},Number.MAX_VALUE);return r.reduce((t,r)=>{let n=P(e,r)-r.r;return n<=t?n:t},n)},isSet:I,layoutGreedyVenn:function(e){let t=[],r={};e.filter(e=>1===e.sets.length).forEach(e=>{r[e.sets[0]]=e.circle={x:Number.MAX_VALUE,y:Number.MAX_VALUE,r:Math.sqrt(e.value/Math.PI)}});let n=(e,r)=>{let n=e.circle;n&&(n.x=r.x,n.y=r.y),t.push(e)};w(e);let i=e.filter(I).sort(V);n(i.shift(),{x:0,y:0});let s=e.filter(e=>2===e.sets.length);for(let e of i){let i=e.circle;if(!i)continue;let l=i.r,o=e.overlapping;n(e,t.reduce((e,n,a)=>{let u=n.circle;if(!u||!o)return e;let c=o[n.sets[0]],f=E(l,u.r,c),h=[{x:u.x+f,y:u.y},{x:u.x-f,y:u.y},{x:u.x,y:u.y+f},{x:u.x,y:u.y-f}];for(let e of t.slice(a+1)){let t=e.circle,r=o[e.sets[0]];if(!t)continue;let n=E(l,t.r,r);h=h.concat(v({x:u.x,y:u.y,r:f},{x:t.x,y:t.y,r:n}))}for(let t of h){i.x=t.x,i.y=t.y;let n=T(r,s);n<e.loss&&(e.loss=n,e.coordinates=t)}return e},{loss:Number.MAX_VALUE,coordinates:void 0}).coordinates)}return r},loss:T,nelderMead:function(e,t){let r=function(e,t){return e.fx-t.fx},n=(e,t,r,n)=>t.map((t,i)=>e*t+r*n[i]),i=(t,r)=>(r.fx=e(r),t[t.length-1]=r,t),s=t=>{let r=t[0];return t.map(t=>{let i=n(.5,r,.5,t);return i.fx=e(i),i})},l=(t,r,i,s)=>{let l=n(i,t,s,r);return l.fx=e(l),l},o=(t=>{let r=t.length,n=Array(r+1);n[0]=t,n[0].fx=e(t);for(let i=0;i<r;++i){let r=t.slice();r[i]=r[i]?1.05*r[i]:.001,r.fx=e(r),n[i+1]=r}return n})(t);for(let e=0;e<100;e++){o.sort(r);let e=o[o.length-1],t=j(o),n=l(t,e,2,-1);if(n.fx<o[0].fx){let r=l(t,e,3,-2);o=i(o,r.fx<n.fx?r:n)}else if(n.fx>=o[o.length-2].fx){let r;o=n.fx>e.fx?(r=l(t,e,.5,.5)).fx<e.fx?i(o,r):s(o):(r=l(t,e,1.5,-.5)).fx<n.fx?i(o,r):s(o)}else o=i(o,n)}return o[0]},processVennData:function(e,t){let r=e?.columns?Array(e.rowCount).fill(void 0).map((t,r)=>e.getRowObject(r)):[],n=r.reduce(function(e,t){var r;return t.sets&&L(r=t)&&I(r)&&r.value>0&&-1===e.indexOf(t.sets[0])&&e.push(t.sets[0]),e},[]).sort(),i=r.reduce(function(e,r){return r.sets&&L(r)&&!r.sets.some(function(e){return -1===n.indexOf(e)})&&(e[r.sets.sort().join(t)]={sets:r.sets,value:r.value||0}),e},{});return n.reduce(function(e,r,n,i){return i.slice(n+1).forEach(function(n){e.push(r+t+n)}),e},[]).forEach(function(e){if(!i[e]){let r={sets:e.split(t),value:0};i[e]=r}}),Object.keys(i).map(function(e){return i[e]})},sortByTotalOverlap:V},{parse:B}=a(),{getAreaOfIntersectionBetweenCircles:X,getCirclesIntersectionPolygon:_,isCircle1CompletelyOverlappingCircle2:D,isPointInsideAllCircles:k,isPointOutsideAllCircles:F}=p,{getCenterOfPoints:U}=u,{scatter:W}=y().seriesTypes;class q extends W{static getLabelPosition(e,t){let r=e.reduce((r,n)=>{let i=n.r/2;return[{x:n.x,y:n.y},{x:n.x+i,y:n.y},{x:n.x-i,y:n.y},{x:n.x,y:n.y+i},{x:n.x,y:n.y-i}].reduce((r,n)=>{let i=S.getMarginFromCircles(n,e,t);return r.margin<i&&(r.point=n,r.margin=i),r},r)},{point:void 0,margin:-Number.MAX_VALUE}).point,n=S.nelderMead(r=>-S.getMarginFromCircles({x:r[0],y:r[1]},e,t),[r.x,r.y]);return k(r={x:n[0],y:n[1]},e)&&F(r,t)||(r=e.length>1?U(_(e)):{x:e[0].x,y:e[0].y}),r}static getLabelValues(e,t){let r=e.sets,n=t.reduce((e,t)=>{let n=r.indexOf(t.sets[0])>-1;return t.circle&&e[n?"internal":"external"].push(t.circle),e},{internal:[],external:[]});n.external=n.external.filter(e=>n.internal.some(t=>!D(e,t)));let i=q.getLabelPosition(n.internal,n.external),s=S.getLabelWidth(i,n.internal,n.external);return{position:i,width:s}}static layout(e){let t={},r={};if(e.length>0){let n=S.layoutGreedyVenn(e),i=e.filter(S.isSet);for(let s of e){let e=s.sets,l=e.join(),o=S.isSet(s)?n[l]:X(e.map(e=>n[e]));o&&(t[l]=o,r[l]=q.getLabelValues(s,i))}}return{mapOfIdToShape:t,mapOfIdToLabelValues:r}}static getScale(e,t,r){let n=r.bottom-r.top,i=r.right-r.left,s=(r.right+r.left)/2,l=(r.top+r.bottom)/2,o=Math.min(i>0?1/i*e:1,n>0?1/n*t:1);return{scale:o,centerX:e/2-s*o,centerY:t/2-l*o}}static updateFieldBoundaries(e,t){let n=t.x-t.r,i=t.x+t.r,s=t.y+t.r,l=t.y-t.r;return(!(0,r.isNumber)(e.left)||e.left>n)&&(e.left=n),(!(0,r.isNumber)(e.right)||e.right<i)&&(e.right=i),(!(0,r.isNumber)(e.top)||e.top>l)&&(e.top=l),(!(0,r.isNumber)(e.bottom)||e.bottom<s)&&(e.bottom=s),e}animate(e){if(!e){let e=(0,r.animObject)(this.options.animation);for(let t of this.points){let r=t.shapeArgs;if(t.graphic&&r){let n={},i={};r.d?n.opacity=.001:(n.r=0,i.r=r.r),t.graphic.attr(n).animate(i,e),r.d&&setTimeout(()=>{t?.graphic?.animate({opacity:1})},e.duration)}}}}drawPoints(){let e=this.chart,t=this.group,n=this.points||[],i=e.renderer;for(let s of n){let n={zIndex:(0,r.isArray)(s.sets)?s.sets.length:0},l=s.shapeArgs;e.styledMode||(0,r.extend)(n,this.pointAttribs(s,s.state)),d(s,{isNew:!s.graphic,animatableAttribs:l,attribs:n,group:t,renderer:i,shapeType:l?.d?"path":"circle"})}}init(){W.prototype.init.apply(this,arguments),delete this.opacity}pointAttribs(e,t){let n=this.options||{},i=e?.options||{},s=t&&n.states?.[t]||{},l=(0,r.merge)(n,i,s);return{fill:B(l.color||e.color).brighten(l.brightness||0).get(),opacity:l.opacity,stroke:l.borderColor,"stroke-width":l.borderWidth,dashstyle:l.borderDashStyle}}translate(){let e=this.chart;this.dataTable.modified=this.dataTable,this.generatePoints();let t=S.processVennData(this.dataTable,q.splitter),{mapOfIdToShape:n,mapOfIdToLabelValues:i}=q.layout(t),s=Object.keys(n).filter(e=>{let t=n[e];return t&&(0,r.isNumber)(t.r)}).reduce((e,t)=>q.updateFieldBoundaries(e,n[t]),{top:0,bottom:0,left:0,right:0}),l=q.getScale(e.plotWidth,e.plotHeight,s),o=l.scale,a=l.centerX,u=l.centerY;for(let e of this.points){let t=(0,r.isArray)(e.sets)?e.sets:[],s=t.join(),l=n[s],c=i[s]||{},f=e.options?.dataLabels,h,p=c.width,d=c.position;if(l){if(l.r)h={x:a+l.x*o,y:u+l.y*o,r:l.r*o};else if(l.d){let e=l.d;e.forEach(e=>{"M"===e[0]?(e[1]=a+e[1]*o,e[2]=u+e[2]*o):"A"===e[0]&&(e[1]=e[1]*o,e[2]=e[2]*o,e[6]=a+e[6]*o,e[7]=u+e[7]*o)}),h={d:e}}d?(d.x=a+d.x*o,d.y=u+d.y*o):d={},(0,r.isNumber)(p)&&(p=Math.round(p*o))}e.shapeArgs=h,d&&h&&(e.plotX=d.x,e.plotY=d.y),p&&h&&(e.dlOptions=(0,r.merge)({style:{width:p}},(0,r.isObject)(f,!0)?f:void 0,{zIndex:void 0}),delete e.dlOptions.zIndex),e.name=e.options.name||t.join("∩")}}}q.splitter="highcharts-split",q.defaultOptions=(0,r.merge)(W.defaultOptions,{borderColor:"var(--highcharts-neutral-color-20)",borderDashStyle:"solid",borderWidth:1,brighten:0,clip:!1,colorByPoint:!0,dataLabels:{enabled:!0,verticalAlign:"middle",formatter:function(){return this.point.name}},inactiveOtherPoints:!0,marker:!1,opacity:.75,showInLegend:!1,legendType:"point",states:{hover:{opacity:1,borderColor:"var(--highcharts-neutral-color-80)"},select:{color:"var(--highcharts-neutral-color-20)",borderColor:"var(--highcharts-neutral-color-100)",animation:!1},inactive:{opacity:.075}},tooltip:{pointFormat:"{point.name}: {point.value}"},legendSymbol:"rectangle"}),(0,r.extend)(q.prototype,{axisTypes:[],directTouch:!0,isCartesian:!1,pointArrayMap:["value"],pointClass:m,utils:S}),(0,r.addEvent)(q,"afterSetOptions",function(e){let t=e.options.states||{};if(this.is("venn"))for(let e of Object.keys(t))t[e].halo=!1}),y().registerSeriesType("venn",q);let z=l();export{z as default};