Ternary diagrams [message #39863] |
Thu, 17 June 2004 07:43  |
hunter
Messages: 9 Registered: June 2003
|
Junior Member |
|
|
Hi there,
Hope you're all having a good day. I'm trying to generate a ternary diagram
(Triangular coordinates) in IDL and can't seem to find much on the subject
in the IDL help. I assume its something I'll have to built from scratch.
However, I'd rather not reinvent the wheel. Has anybody had some experince
in this area? or can someone please provide me with a good reference on the
subject?
Any help would be appreciated.
Thanks,
Eli
|
|
|
Re: Ternary diagram [message #55586 is a reply to message #39863] |
Mon, 03 September 2007 08:51   |
robinson.inj
Messages: 32 Registered: August 2007
|
Member |
|
|
On Sep 3, 6:13 am, Wox <nom...@hotmail.com> wrote:
> On Sat, 01 Sep 2007 18:23:07 -0000, robinson....@gmail.com wrote:
>> Dear all,
>> Does someone can show me (or point me out a link) how to generate
>> ternary diagrams/plots in IDL?
>> I will really appreciate your assistance.
>> Robinson
>
> There is nothing out there that I know of that generates ternary
> diagrams. I tried to make something myself ones. Maybe it'll get you
> started:
>
> function NormToTriangle,Anorm,Bnorm,Cnorm,AP,BP,CP
>
> ; equation line : y=(x-x1).(y2-y1)/(x2-x1)+y1 (2 points)
> ; y=(x-x1).r+y1 (rico+point)
>
> sqrt3=sqrt(3)
> n=n_elements(Anorm)
>
> PAx=CP[0]-0.5*Anorm
> PAy=CP[1]+(sqrt3*0.5)*Anorm
> ;rC = 0
>
> PBx=AP[0]-0.5*Bnorm
> PBy=AP[1]-(sqrt3*0.5)*Bnorm
> ;rA = -sqrt3
>
> PCx=BP[0]+Cnorm
> PCy=BP[1]*replicate(1,n)
> ;rB = sqrt3
>
> ; find point where these three lines cross
> ; (bad code, just checked two lines)
> Px=(-PAy+sqrt3*PBx+PBy)/sqrt3
> Py=(PBx-Px)*sqrt3+PBy
>
> return,{x:Px,y:Py}
> end;function NormToTriangle
> ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%
>
> pro TriangleConstr,AP,BP,CP,pfree,R=R,GAP=GAP,ArrowCoord=ArrowCo ord
>
> ; AP,BP,CP: corner coordinates
> ; pfree: procent of window size to leave free on one side of the
> triangle
> ; R: vertex length
> ; GAP: scale the trangle and leave gaps
> ; ArrowCoord: ArrowCoord
>
> ; A
> ; / \
> ; / \
> ; / \
> ; / \
> ; / \
> ; B___________C
>
> XS=!d.x_size
> YS=!d.y_size
>
> X0=XS/2.
> Y0=YS/2.
> XY0=X0<Y0
> R0=(1-pfree)*XY0
> R=R0*sqrt(3)
> Y0=Y0-0.25*R0
>
> dX=R*0.5
> dY=R0*0.5
> AP=[X0,Y0+R0]
> BP=[X0-dX,Y0-dY]
> CP=[X0+dX,Y0-dY]
>
> if keyword_set(GAP) then begin
> ct=sqrt(3)*0.5
>
> DR=(1-GAP)*XY0-R0
> dX=dR*ct
> dY=dR*0.5
> dZ=dY*[ct,0.5]
> dU=dY*[-ct,0.5]
> dV=[0,-dY]
>
> ArrowCoord=[[BP+dV],[CP+dV],[CP+dZ],$
> [AP+dZ],[AP+dU],[BP+dU]]
> endif
>
> end;pro TriangleConstr
> ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%
>
> pro
> TernaryDiagram,Ain,Bin,Cin,ATitle=ATitle,BTitle=BTitle,CTitl e=CTitle
>
> ; ----Check primary parameters----
> if not keyword_set(ATitle) then ATitle='A'
> if not keyword_set(BTitle) then BTitle='B'
> if not keyword_set(CTitle) then CTitle='C'
>
> nA=n_elements(Ain)
> nB=n_elements(Bin)
> nC=n_elements(Cin)
>
> if (nA eq 0) or (nB eq 0) or (nC eq 0) or (nA ne nB) or (nA ne nC)
> then $
> message,'A,B,C dimensions are wrong.'
>
> ; ----Construct diagram----
> pfree=0.02
> gap=-0.1
> gap2=-0.2
> TriangleConstr,AP,BP,CP,pfree,R=R,GAP=gap,ArrowCoord=AC
> TriangleConstr,APl,BPl,CPl,gap,GAP=gap2,ArrowCoord=AC2
>
> plots,[BP[0],CP[0]],[BP[1],CP[1]],/device,thick=2
> plots,[CP[0],AP[0]],[CP[1],AP[1]],/device,thick=2
> plots,[AP[0],BP[0]],[AP[1],BP[1]],/device,thick=2
> xyouts,BPl[0],BPl[1],BTitle,/device
> xyouts,CPl[0],CPl[1],CTitle,/device
> xyouts,APl[0],APl[1],ATitle,/device
> arrow,AC[0,0],AC[1,0],AC[0,1],AC[1,1]
> arrow,AC[0,2],AC[1,2],AC[0,3],AC[1,3]
> arrow,AC[0,4],AC[1,4],AC[0,5],AC[1,5]
>
> xyouts,(AC2[0,4]+AC2[0,5])/2,(AC2[1,4]+AC2[1,5])/2,BTitle+'
> %',/device,ORIENTATION=60
> xyouts,(AC2[0,0]+AC2[0,1])/2,(AC2[1,0]+AC2[1,1])/2,CTitle+'
> %',/device,ORIENTATION=0
> xyouts,(AC2[0,2]+AC2[0,3])/2,(AC2[1,2]+AC2[1,3])/2,ATitle+'
> %',/device,ORIENTATION=-60
>
> ; ----Derive coordinates----
>
> ; sum must be 1, then scale between 0-R
> sum=float(Ain+Bin+Cin)
> Anorm=Ain/sum*R
> Bnorm=Bin/sum*R
> Cnorm=Cin/sum*R
>
> data=NormToTriangle(Anorm,Bnorm,Cnorm,AP,BP,CP)
> plots,data.x,data.y,psym=2,/device
>
> ; ----Grid----
> n=10
> m=n-1
> ind=(indgen(1,m)+1.)/n
> rind=reverse(ind,2)
> zero=replicate(0.,1,m)
>
> ;CA
> Anorm=[zero,ind]*R
> Bnorm=[ind,zero]*R
> Cnorm=[rind,rind]*R
> data=NormToTriangle(Anorm,Bnorm,Cnorm,AP,BP,CP)
> for i=0,m-1 do $
> plots,data.x[*,i],data.y[*,i],linestyle=1,/device
>
> ;AB
> Anorm=[ind,ind]*R
> Bnorm=[zero,rind]*R
> Cnorm=[rind,zero]*R
> data=NormToTriangle(Anorm,Bnorm,Cnorm,AP,BP,CP)
> for i=0,m-1 do $
> plots,data.x[*,i],data.y[*,i],linestyle=1,/device
>
> ;BC
> Anorm=[rind,zero]*R
> Bnorm=[ind,ind]*R
> Cnorm=[zero,rind]*R
> data=NormToTriangle(Anorm,Bnorm,Cnorm,AP,BP,CP)
> for i=0,m-1 do $
> plots,data.x[*,i],data.y[*,i],linestyle=1,/device
>
> end;pro TernaryDiagram
> ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%
>
> pro example
>
> window
> A=[20,50,25,20]
> B=[30,0,25,70]
> C=[50,50,50,10]
>
> TernaryDiagram,A,B,C
>
> end;pro example
Dear Wox, I knew that wouldnt be easy. As you showed :-O Thank you
very much.
Robinson
|
|
|
Re: Ternary diagram [message #55587 is a reply to message #39863] |
Mon, 03 September 2007 06:13   |
Wox
Messages: 184 Registered: August 2006
|
Senior Member |
|
|
On Sat, 01 Sep 2007 18:23:07 -0000, robinson.inj@gmail.com wrote:
> Dear all,
> Does someone can show me (or point me out a link) how to generate
> ternary diagrams/plots in IDL?
> I will really appreciate your assistance.
> Robinson
There is nothing out there that I know of that generates ternary
diagrams. I tried to make something myself ones. Maybe it'll get you
started:
function NormToTriangle,Anorm,Bnorm,Cnorm,AP,BP,CP
; equation line : y=(x-x1).(y2-y1)/(x2-x1)+y1 (2 points)
; y=(x-x1).r+y1 (rico+point)
sqrt3=sqrt(3)
n=n_elements(Anorm)
PAx=CP[0]-0.5*Anorm
PAy=CP[1]+(sqrt3*0.5)*Anorm
;rC = 0
PBx=AP[0]-0.5*Bnorm
PBy=AP[1]-(sqrt3*0.5)*Bnorm
;rA = -sqrt3
PCx=BP[0]+Cnorm
PCy=BP[1]*replicate(1,n)
;rB = sqrt3
; find point where these three lines cross
; (bad code, just checked two lines)
Px=(-PAy+sqrt3*PBx+PBy)/sqrt3
Py=(PBx-Px)*sqrt3+PBy
return,{x:Px,y:Py}
end;function NormToTriangle
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%
pro TriangleConstr,AP,BP,CP,pfree,R=R,GAP=GAP,ArrowCoord=ArrowCo ord
; AP,BP,CP: corner coordinates
; pfree: procent of window size to leave free on one side of the
triangle
; R: vertex length
; GAP: scale the trangle and leave gaps
; ArrowCoord: ArrowCoord
; A
; / \
; / \
; / \
; / \
; / \
; B___________C
XS=!d.x_size
YS=!d.y_size
X0=XS/2.
Y0=YS/2.
XY0=X0<Y0
R0=(1-pfree)*XY0
R=R0*sqrt(3)
Y0=Y0-0.25*R0
dX=R*0.5
dY=R0*0.5
AP=[X0,Y0+R0]
BP=[X0-dX,Y0-dY]
CP=[X0+dX,Y0-dY]
if keyword_set(GAP) then begin
ct=sqrt(3)*0.5
DR=(1-GAP)*XY0-R0
dX=dR*ct
dY=dR*0.5
dZ=dY*[ct,0.5]
dU=dY*[-ct,0.5]
dV=[0,-dY]
ArrowCoord=[[BP+dV],[CP+dV],[CP+dZ],$
[AP+dZ],[AP+dU],[BP+dU]]
endif
end;pro TriangleConstr
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%
pro
TernaryDiagram,Ain,Bin,Cin,ATitle=ATitle,BTitle=BTitle,CTitl e=CTitle
; ----Check primary parameters----
if not keyword_set(ATitle) then ATitle='A'
if not keyword_set(BTitle) then BTitle='B'
if not keyword_set(CTitle) then CTitle='C'
nA=n_elements(Ain)
nB=n_elements(Bin)
nC=n_elements(Cin)
if (nA eq 0) or (nB eq 0) or (nC eq 0) or (nA ne nB) or (nA ne nC)
then $
message,'A,B,C dimensions are wrong.'
; ----Construct diagram----
pfree=0.02
gap=-0.1
gap2=-0.2
TriangleConstr,AP,BP,CP,pfree,R=R,GAP=gap,ArrowCoord=AC
TriangleConstr,APl,BPl,CPl,gap,GAP=gap2,ArrowCoord=AC2
plots,[BP[0],CP[0]],[BP[1],CP[1]],/device,thick=2
plots,[CP[0],AP[0]],[CP[1],AP[1]],/device,thick=2
plots,[AP[0],BP[0]],[AP[1],BP[1]],/device,thick=2
xyouts,BPl[0],BPl[1],BTitle,/device
xyouts,CPl[0],CPl[1],CTitle,/device
xyouts,APl[0],APl[1],ATitle,/device
arrow,AC[0,0],AC[1,0],AC[0,1],AC[1,1]
arrow,AC[0,2],AC[1,2],AC[0,3],AC[1,3]
arrow,AC[0,4],AC[1,4],AC[0,5],AC[1,5]
xyouts,(AC2[0,4]+AC2[0,5])/2,(AC2[1,4]+AC2[1,5])/2,BTitle+'
%',/device,ORIENTATION=60
xyouts,(AC2[0,0]+AC2[0,1])/2,(AC2[1,0]+AC2[1,1])/2,CTitle+'
%',/device,ORIENTATION=0
xyouts,(AC2[0,2]+AC2[0,3])/2,(AC2[1,2]+AC2[1,3])/2,ATitle+'
%',/device,ORIENTATION=-60
; ----Derive coordinates----
; sum must be 1, then scale between 0-R
sum=float(Ain+Bin+Cin)
Anorm=Ain/sum*R
Bnorm=Bin/sum*R
Cnorm=Cin/sum*R
data=NormToTriangle(Anorm,Bnorm,Cnorm,AP,BP,CP)
plots,data.x,data.y,psym=2,/device
; ----Grid----
n=10
m=n-1
ind=(indgen(1,m)+1.)/n
rind=reverse(ind,2)
zero=replicate(0.,1,m)
;CA
Anorm=[zero,ind]*R
Bnorm=[ind,zero]*R
Cnorm=[rind,rind]*R
data=NormToTriangle(Anorm,Bnorm,Cnorm,AP,BP,CP)
for i=0,m-1 do $
plots,data.x[*,i],data.y[*,i],linestyle=1,/device
;AB
Anorm=[ind,ind]*R
Bnorm=[zero,rind]*R
Cnorm=[rind,zero]*R
data=NormToTriangle(Anorm,Bnorm,Cnorm,AP,BP,CP)
for i=0,m-1 do $
plots,data.x[*,i],data.y[*,i],linestyle=1,/device
;BC
Anorm=[rind,zero]*R
Bnorm=[ind,ind]*R
Cnorm=[zero,rind]*R
data=NormToTriangle(Anorm,Bnorm,Cnorm,AP,BP,CP)
for i=0,m-1 do $
plots,data.x[*,i],data.y[*,i],linestyle=1,/device
end;pro TernaryDiagram
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%
pro example
window
A=[20,50,25,20]
B=[30,0,25,70]
C=[50,50,50,10]
TernaryDiagram,A,B,C
end;pro example
|
|
|
Re: Ternary diagrams [message #86999 is a reply to message #39863] |
Thu, 19 December 2013 06:49  |
nicholasehamilton
Messages: 2 Registered: December 2013
|
Junior Member |
|
|
Dear Eli,
I wanted to mention that I have just published on CRAN, a package for R, for the plotting of ternary diagrams.
It is based off ggplot2, which is highly regarded, and, my website can be viewed at www.ggtern.com, including many examples, specifically including a case study at the following address:
http://ggtern.com/case-study-zirconia-alumina-silica/
Hope you find it of value.
Best Regards,
Nicholas Hamilton
School of Materials Science and Engineering
Univesity of New South Wales
Sydney Australia
--
www.ggtern.com
On Friday, June 18, 2004 12:43:04 AM UTC+10, hunter wrote:
> Hi there,
>
> Hope you're all having a good day. I'm trying to generate a ternary diagram
> (Triangular coordinates) in IDL and can't seem to find much on the subject
> in the IDL help. I assume its something I'll have to built from scratch.
> However, I'd rather not reinvent the wheel. Has anybody had some experince
> in this area? or can someone please provide me with a good reference on the
> subject?
>
> Any help would be appreciated.
>
> Thanks,
> Eli
|
|
|