function MakeTernaryTemplate([variable crop]) // was crop specified? If not, default is the full ternary crop = ParamIsDefault(crop) ? 10 : Crop*10 // aspect ratio of the ternary plot variable aspectRatio switch(crop) case 10 : Make/D/O/N=(37,4) M_TernaryTemplate = NaN M_TernaryTemplate[0][0]= {0,1,0.5,0} M_TernaryTemplate[0][1]= {0,0,1,0} M_TernaryTemplate[0][2]= {0.05,0.1,0.55,0.45,0.9,0.95,0.05,NaN,0.1,0.2,0.2,0.6,0.4,0.8,0.9,0.1,NaN,0.15,0.3,0.65,0.35,0.7,0.85,0.15,NaN,0.2,0.4,0.7,0.3,0.6,0.8,0.2,NaN,0.25,0.5,0.75,0.25} M_TernaryTemplate[0][3]= {0.1,0,0.9,0.9,0,0.1,0.1,NaN,0.2,0,0,0.8,0.8,0,0.2,0.2,NaN,0.3,0,0.7,0.7,0,0.3,0.3,NaN,0.4,0,0.6,0.6,0,0.4,0.4,NaN,0.5,0,0.5,0.5} aspectRatio = 1.25 break case 3 : Make/D/O/N=(44,4) M_TernaryTemplate = NaN M_TernaryTemplate[0][0]= {0,1,0.85,0.15,0} M_TernaryTemplate[0][1]= {0,0,0.3,0.3,0} M_TernaryTemplate[0][2]= {0.05,0.95,NaN,0.1,0.9,NaN,0.15,0.85,NaN,0.05,0.1,0.25,NaN,0.1,0.2,0.35,NaN,0.15,0.3,0.45,NaN,0.25,0.4,0.55,NaN,0.35,0.5,0.65,NaN,0.45,0.6,0.75,NaN,0.55,0.7,0.85,NaN,0.65,0.8,0.9,NaN,0.75,0.9,0.95} M_TernaryTemplate[0][3]= {0.1,0.1,NaN,0.2,0.2,NaN,0.3,0.3,NaN,0.1,0,0.3,NaN,0.2,0,0.3,NaN,0.3,0,0.3,NaN,0.3,0,0.3,NaN,0.3,0,0.3,NaN,0.3,0,0.3,NaN,0.3,0,0.3,NaN,0.3,0,0.2,NaN,0.3,0,0.1} aspectRatio = 4 break case 4 : Make/D/O/N=(47,4) M_TernaryTemplate = NaN M_TernaryTemplate[0][0]= {0,1,0.8,0.2,0} M_TernaryTemplate[0][1]= {0,0,0.4,0.4,0} M_TernaryTemplate[0][2]= {0.05,0.95,NaN,0.1,0.9,NaN,0.15,0.85,NaN,0.2,0.8,NaN,0.05,0.1,0.3,NaN,0.1,0.2,0.4,NaN,0.15,0.3,0.5,NaN,0.2,0.4,0.6,NaN,0.3,0.5,0.7,NaN,0.4,0.6,0.8,NaN,0.5,0.7,0.85,NaN,0.6,0.8,0.9,NaN,0.7,0.9,0.95} M_TernaryTemplate[0][3]= {0.1,0.1,NaN,0.2,0.2,NaN,0.3,0.3,NaN,0.4,0.4,NaN,0.1,0,0.4,NaN,0.2,0,0.4,NaN,0.3,0,0.4,NaN,0.4,0,0.4,NaN,0.4,0,0.4,NaN,0.4,0,0.4,NaN,0.4,0,0.3,NaN,0.4,0,0.2,NaN,0.4,0,0.1} aspectRatio = 3 break case 5 : Make/D/O/N=(50,4) M_TernaryTemplate = NaN M_TernaryTemplate[0][0]= {0,1,0.75,0.25,0} M_TernaryTemplate[0][1]= {0,0,0.5,0.5,0} M_TernaryTemplate[0][2]= {0.05,0.95,NaN,0.1,0.9,NaN,0.15,0.85,NaN,0.2,0.8,NaN,0.25,0.75,NaN,0.05,0.1,0.35,NaN,0.1,0.2,0.45,NaN,0.15,0.3,0.55,NaN,0.2,0.4,0.65,NaN,0.25,0.5,0.75,NaN,0.35,0.6,0.8,NaN,0.45,0.7,0.85,NaN} M_TernaryTemplate[43][2]= {0.55,0.8,0.9,NaN,0.65,0.9,0.95} M_TernaryTemplate[0][3]= {0.1,0.1,NaN,0.2,0.2,NaN,0.3,0.3,NaN,0.4,0.4,NaN,0.5,0.5,NaN,0.1,0,0.5,NaN,0.2,0,0.5,NaN,0.3,0,0.5,NaN,0.4,0,0.5,NaN,0.5,0,0.5,NaN,0.5,0,0.4,NaN,0.5,0,0.3,NaN,0.5,0,0.2,NaN,0.5,0,0.1} aspectRatio = 2.5 break case 6 : Make/D/O/N=(53,4) M_TernaryTemplate = NaN M_TernaryTemplate[0][0]= {0,1,0.7,0.3,0} M_TernaryTemplate[0][1]= {0,0,0.6,0.6,0} M_TernaryTemplate[0][2]= {0.05,0.95,NaN,0.1,0.9,NaN,0.15,0.85,NaN,0.2,0.8,NaN,0.25,0.75,NaN,0.3,0.7,NaN,0.05,0.1,0.4,NaN,0.1,0.2,0.5,NaN,0.15,0.3,0.6,NaN,0.2,0.4,0.7,NaN,0.25,0.5,0.75,NaN,0.3,0.6,0.8,NaN,0.4,0.7,0.85} M_TernaryTemplate[45][2]= {NaN,0.5,0.8,0.9,NaN,0.6,0.9,0.95} M_TernaryTemplate[0][3]= {0.1,0.1,NaN,0.2,0.2,NaN,0.3,0.3,NaN,0.4,0.4,NaN,0.5,0.5,NaN,0.6,0.6,NaN,0.1,0,0.6,NaN,0.2,0,0.6,NaN,0.3,0,0.6,NaN,0.4,0,0.6,NaN,0.5,0,0.5,NaN,0.6,0,0.4,NaN,0.6,0,0.3,NaN,0.6,0,0.2,NaN,0.6,0,0.1} aspectRatio = 2 break case 7 : Make/D/O/N=(53,4) M_TernaryTemplate = NaN M_TernaryTemplate[0][0]= {0,1,0.65,0.35,0} M_TernaryTemplate[0][1]= {0,0,0.7,0.7,0} M_TernaryTemplate[0][2]= {0.05,0.95,NaN,0.1,0.9,NaN,0.15,0.85,NaN,0.2,0.8,NaN,0.25,0.75,NaN,0.3,0.7,NaN,0.05,0.1,0.45,NaN,0.1,0.2,0.55,NaN,0.15,0.3,0.65,NaN,0.2,0.4,0.7,NaN,0.25,0.5,0.75,NaN,0.3,0.6,0.8,NaN,0.35,0.7} M_TernaryTemplate[44][2]= {0.85,NaN,0.45,0.8,0.9,NaN,0.55,0.9,0.95} M_TernaryTemplate[0][3]= {0.1,0.1,NaN,0.2,0.2,NaN,0.3,0.3,NaN,0.4,0.4,NaN,0.5,0.5,NaN,0.6,0.6,NaN,0.1,0,0.7,NaN,0.2,0,0.7,NaN,0.3,0,0.7,NaN,0.4,0,0.6,NaN,0.5,0,0.5,NaN,0.6,0,0.4,NaN,0.7,0,0.3,NaN,0.7,0,0.2,NaN,0.7,0,0.1} aspectRatio = 1.75 break default: DoAlert 0, "Sorry, that crop-value is not supported!" return -1 endswitch // convert Y (columns 1 and 3) to ternary coordinates variable factor = cos(30*pi/180) M_ternaryTemplate[][1] /= factor M_ternaryTemplate[][3] /= factor // display ternary if it doesn't exist DoWindow/F Ternary if(!V_flag) Display/N=Ternary M_TernaryTemplate[][1] vs M_TernaryTemplate[][0] ModifyGraph noLabel=2,axThick=0, rgb=(0,0,0), lsize(M_TernaryTemplate)=2 ModifyGraph margin=50 // append grid AppendToGraph M_TernaryTemplate[][3] vs M_TernaryTemplate[][2] ModifyGraph rgb(M_TernaryTemplate#1)=(16385,28398,65535), lstyle(M_TernaryTemplate#1)=1 endif ModifyGraph width={Aspect,aspectRatio} return 1 end function ConvMatrix2Ternary(M_Data) // M_Data needs to be organised: left [][0], right [][1], top[][2] of the ternary wave M_Data // Make temp wave: normalise in case it isn't and/or turn to fractions Duplicate/O/FREE M_Data, M_temp MatrixOP/FREE W_Sum = sumRows(M_temp) M_temp = M_temp[p][q] / W_Sum[p] // make output wave M_XY Make/D/O/N=(DimSize(M_Data,0), 2) M_XY // Do transformation to ternary coordinates; // Then use: AppendToGraph M_xy[][1] vs M_xy[][0] to add to ternary template M_XY[][0] = 0.5 * M_temp[p][2] + M_temp[p][1] M_XY[][1] = M_temp[p][2] * cos(30 * (pi/180)) end