UNPKG

d3-ternary

Version:
4 lines (3 loc) 6.3 kB
// d3-ternary v3.0.7 Copyright 2025, Jules Blom import{scaleLinear as e}from"d3-scale";function t(e){let t=300,n="%";const l={label:"A",labelAngle:0,labelOffset:45,tickAngle:0,tickSize:6,tickTextAnchor:"start"},i={label:"B",labelAngle:60,labelOffset:45,tickAngle:60,tickSize:6,tickTextAnchor:"end"},r={label:"C",labelAngle:-60,labelOffset:45,tickAngle:-60,tickSize:6,tickTextAnchor:"end"};function a(e,n){return[e*t,n*t]}const c=function(t){const[n,l]=e(t);return a(n,l)};function o(){return[a(...e.unscaled([1,0,0])),a(...e.unscaled([0,1,0])),a(...e.unscaled([0,0,1]))]}return c.triangle=function(){const[e,t,n]=o();return`M${e}L${t}L${n}Z`},c.gridLines=function(t=10){const[n,l,i]=e.scales(),r=Array.isArray(t)?t:[+t,+t,+t];return[n.ticks(r[0]).map((t=>{const l=n(t);return[a(...e.unscaled([l,1-l,0])),a(...e.unscaled([l,0,1-l]))]})),l.ticks(r[1]).map((t=>{const n=l(t);return[a(...e.unscaled([0,n,1-n])),a(...e.unscaled([1-n,n,0]))]})),i.ticks(r[2]).map((t=>{const n=i(t);return[a(...e.unscaled([1-n,0,n])),a(...e.unscaled([0,1-n,n]))]}))]},c.axisLabels=function({center:e=!1}={}){const[n,a,c]=o();if(e){const e=[(n[0]+a[0])/2,(n[1]+a[1])/2],o=[(a[0]+c[0])/2,(a[1]+c[1])/2],s=[(c[0]+n[0])/2,(c[1]+n[1])/2];return[{position:[e[0]/t*(t+l.labelOffset),e[1]/t*(t+l.labelOffset)],label:l.label,angle:l.labelAngle},{position:[o[0]/t*(t+i.labelOffset),o[1]/t*(t+i.labelOffset)],label:i.label,angle:i.labelAngle},{position:[s[0]/t*(t+r.labelOffset),s[1]/t*(t+r.labelOffset)],label:r.label,angle:r.labelAngle}]}return[{position:[n[0]+n[0]*(l.labelOffset/t),n[1]+n[1]*(l.labelOffset/t)],label:l.label,angle:l.labelAngle},{position:[a[0]+a[0]*(i.labelOffset/t),a[1]+a[1]*(i.labelOffset/t)],label:i.label,angle:i.labelAngle},{position:[c[0]+c[0]*(r.labelOffset/t),c[1]+c[1]*(r.labelOffset/t)],label:r.label,angle:r.labelAngle}]},c.ticks=function(t=10){const[c,o,s]=e.scales(),u=Array.isArray(t)?t:[+t,+t,+t],f="function"==typeof n?n:c.tickFormat(u[0],n),b="function"==typeof n?n:o.tickFormat(u[1],n),k="function"==typeof n?n:s.tickFormat(u[2],n);return[c.ticks(u[0]).map((t=>{const n=c(t);return{tick:f(t),angle:l.tickAngle,textAnchor:l.tickTextAnchor,size:l.tickSize,position:a(...e.unscaled([n,0,1-n]))}})),o.ticks(u[1]).map((t=>{const n=o(t);return{tick:b(t),angle:i.tickAngle,textAnchor:i.tickTextAnchor,size:i.tickSize,position:a(...e.unscaled([1-n,n,0]))}})),s.ticks(u[2]).map((t=>{const n=s(t);return{tick:k(t),angle:r.tickAngle,textAnchor:r.tickTextAnchor,size:r.tickSize,position:a(...e.unscaled([0,1-n,n]))}}))]},c.tickFormat=function(e){return arguments.length?(n=e??"%",c):n},c.radius=function(e){return void 0===e?t:(t=+e,c)},c.invert=function(n){return e.invert([n[0]/t,n[1]/t])},c.labels=function(e){return e?(l.label=String(e[0]),i.label=String(e[1]),r.label=String(e[2]),c):[l.label,i.label,r.label]},c.tickAngles=function(e){return e?(l.tickAngle=e[0],i.tickAngle=e[1],r.tickAngle=e[2],c):[l.tickAngle,i.tickAngle,r.tickAngle]},c.labelAngles=function(e){return e?(l.labelAngle=e[0],i.labelAngle=e[1],r.labelAngle=e[2],c):[l.labelAngle,i.labelAngle,r.labelAngle]},c.tickTextAnchors=function(e){return e?(l.tickTextAnchor=e[0],i.tickTextAnchor=e[1],r.tickTextAnchor=e[2],c):[l.tickTextAnchor,i.tickTextAnchor,r.tickTextAnchor]},c.tickSizes=function(e){return e?Array.isArray(e)?(l.tickSize=e[0],i.tickSize=e[1],r.tickSize=e[2],c):(l.tickSize=i.tickSize=r.tickSize=+e,c):[l.tickSize,i.tickSize,r.tickSize]},c.labelOffsets=function(e){return e?Array.isArray(e)?(l.labelOffset=e[0],i.labelOffset=e[1],r.labelOffset=e[2],c):(l.labelOffset=i.labelOffset=r.labelOffset=+e,c):[l.labelOffset,i.labelOffset,r.labelOffset]},c}function n(){let t=0,n=e=>e[0],i=e=>e[1],r=e=>e[2];const a=e().domain([0,1]),c=e().domain([0,1]),o=e().domain([0,1]),s=Math.PI/180,[u,f,b]=[-90,150,30].map((e=>[Math.cos(e*s),Math.sin(e*s)]));function k([e,t,n]){return[e*u[0]+t*f[0]+n*b[0],e*u[1]+t*f[1]+n*b[1]]}function A(e,n){const l=t*Math.PI/180,i=Math.cos(l),r=Math.sin(l);return[e*i+n*r,n*i-e*r]}function h([e,t,n]){if(Number.isNaN(e)||Number.isNaN(t)||Number.isNaN(n))throw new Error("Invalid ternary coordinates: values must be numbers");const[l,i,r]=[Number(e),Number(t),Number(n)],a=l+i+r;return 0===a?[0,0,0]:[l/a,i/a,r/a]}const g=function(e){const[t,l,s]=h([n(e),i(e),r(e)]),[u,f]=k([a(t),c(l),o(s)]);return A(u,f)};return g.unscaled=function(e){const[t,n,l]=h(e),[i,r]=k([t,n,l]);return A(i,r)},g.invert=function([e,n]){const l=-t*Math.PI/180,i=Math.cos(l),r=Math.sin(l),s=e*i+n*r,k=n*i-e*r,[A,h]=u,[g,d]=f,[m,O]=b,p=d-O,x=m-g,M=A-m,S=O-h,z=s-m,N=k-O,w=p*M+x*(h-O),y=Math.abs((p*z+x*N)/w),T=Math.abs((S*z+M*N)/w),v=Math.abs(1-y-T);return[a.invert(y),c.invert(T),o.invert(v)]},g.a=function(e){return e?(n=e,g):n},g.b=function(e){return e?(i=e,g):i},g.c=function(e){return e?(r=e,g):r},g.rotation=function(e){return arguments.length?(t=e??0,g):t},g.domains=function(e){if(!e)return[a.domain(),c.domain(),o.domain()];if(1!==l(e).size)throw new Error("All domains must have the same length");return a.domain(e[0]),c.domain(e[1]),o.domain(e[2]),g},g.scales=function(){return[a,c,o]},g}function l(e){return new Set(e.map((e=>{const t=Math.round(100*(e[0]+Number.EPSILON))/100,n=Math.round(100*(e[1]+Number.EPSILON))/100,l=Math.abs(n-t);return Math.round(100*(l+Number.EPSILON))/100})))}function i(e){const{k:t,x:n,y:l}=e,i=1/t;if(i>1)throw new Error(`Invalid zoom level: ${t}. Cannot zoom out beyond the original triangle.`);const r=(t-1)/(3*t),a=Math.PI/180,[c,o,s]=[-90,150,30].map((e=>[Math.cos(e*a),Math.sin(e*a)])),u=c[0]*(o[1]-s[1])+o[0]*(s[1]-c[1])+s[0]*(c[1]-o[1]),f=r-(n/t*(o[1]-s[1])+l/t*(s[0]-o[0]))/u,b=r-(n/t*(s[1]-c[1])+l/t*(c[0]-s[0]))/u,k=r-(n/t*(c[1]-o[1])+l/t*(o[0]-c[0]))/u,A=f+i,h=b+i,g=k+i,d=-1e-5,m=1.00001;if(f<d||A>m)throw new Error(`New domain A exceeds bounds ${[f,A]}`);if(b<d||h>m)throw new Error(`New domain B exceeds bounds ${[b,h]}`);if(k<d||g>m)throw new Error(`New domain C exceeds bounds ${[k,g]}`);return[[f,A],[b,h],[k,g]]}function r(e){const[t,n,i]=e,r=1/[...l(e)][0],a=(r-1)/(3*r),c=a-t[0],o=a-n[0],s=a-i[0],u=Math.PI/180,[f,b,k]=[-90,150,30].map((e=>[Math.cos(e*u),Math.sin(e*u)]));return{k:r,x:(f[0]*c+b[0]*o+k[0]*s)*r,y:(f[1]*c+b[1]*o+k[1]*s)*r}}export{n as barycentric,i as domainsFromTransform,t as ternaryPlot,r as transformFromDomains}; //# sourceMappingURL=d3-ternary.min.js.map