Shaded triplet in r

I could calculate the triplet using the klaR package ........

require(klaR) triplot(label = c("1, 2 or 3", "4 or 5", "6"), main = "die rolls: probabilities", pch = 17) 

I want to build a shaded triplet so that I can show where some point in the class falls.

Is there any package (developed or underdeveloped) for this? Or can we customize the available packages for this?

enter image description here

Editing: in response to the answer below:

 xpoint <- matrix(c(0, 0, 10, 0, 10, 0, 10,0,0, 10,10, 0, 10,0,10, 0,0, 10, 0,10,10, 10,10,10), ncol =3, byrow= TRUE) xp <- t(apply(xpoint,1,tern2cart)) points(xp[,1], y = xp[,2], type = "p", col = "green", pch = "*", cex = 4) text(xp[,1]-0.01,xp[,2]-0.01) > xpoint [,1] [,2] [,3] [1,] 0 0 10 [2,] 0 10 0 [3,] 10 0 0 [4,] 10 10 0 [5,] 10 0 10 [6,] 0 0 10 [7,] 0 10 10 [8,] 10 10 10 

enter image description here

+6
source share
2 answers

So (as for the answer I gave for this question ), I can’t provide you the answer using triplot (since I don’t know which link this function uses to build the diagram), but here is the solution from scratch:

 #First draw the empty ternary diagram: plot(NA,NA,xlim=c(0,1),ylim=c(0,sqrt(3)/2),asp=1,bty="n",axes=F,xlab="",ylab="") segments(0,0,0.5,sqrt(3)/2) segments(0.5,sqrt(3)/2,1,0) segments(1,0,0,0) text(0,0,labels="1, 2 or 3",pos=1) text(1,0,labels="6",pos=1) text(0.5,sqrt(3)/2,labels="4 or 5",pos=3) #The following function is for transforming ternary coordinates into cartesian coordinates: tern2cart <- function(coord){ coord[1]->x coord[2]->y coord[3]->z x+y+z->tot x/tot -> x y/tot -> y z/tot -> z (2*y + z)/(2*(x+y+z)) -> x1 sqrt(3)*z/(2*(x+y+z)) -> y1 return(c(x1,y1)) } #Here are your zones: green.zone<-matrix(c(0,0,100,40,0,60,0,40,60,0,0,100),nrow=4,byrow=TRUE) blue.zone<-matrix(c(30,10,60,30,40,30,0,70,30,0,40,60,30,10,60),nrow=5,byrow=TRUE) purple.zone<-matrix(c(90,0,10,100,0,0,30,70,0,30,40,30,50,40,10,90,0,10),nrow=6,byrow=TRUE) red.zone<-matrix(c(30,40,30,30,70,0,0,100,0,0,70,30,30,40,30),nrow=5,byrow=TRUE) yellow.zone<-matrix(c(90,0,10,40,0,60,30,10,60,30,40,30,50,40,10,90,0,10),nrow=6,byrow=TRUE) #Then transformed into cartesian coordinates: t(apply(green.zone,1,tern2cart))->green t(apply(blue.zone,1,tern2cart))->blue t(apply(purple.zone,1,tern2cart))->purple t(apply(red.zone,1,tern2cart))->red t(apply(yellow.zone,1,tern2cart))->yellow #And plotted: polygon(green,col="green",border=NULL) polygon(blue,col="blue",border=NULL) polygon(purple,col="purple",border=NULL) polygon(red,col="red",border=NULL) polygon(yellow,col="yellow",border=NULL) #And finally the grid: a<-seq(0.9,0.1, by=-0.1) b<-rep(0,9) c<-seq(0.1,0.9,by=0.1) grid<-data.frame(x=c(a, b, c, a, c, b),y=c(b, c, a, c, b, a),z=c(c, a, b, b, a, c)) t(apply(grid,1,tern2cart)) -> grid.tern cbind(grid.tern[1:27,],grid.tern[28:54,])->grid apply(grid,1,function(x){segments(x0=x[1],y0=x[2],x1=x[3],y1=x[4],lty=2,col="grey80")}) 

Obviously you can turn this into a function if you need ...

enter image description here

Edit: with tags

 paste(seq(10,90,by=10),"%")->lab text(grid.tern[9:1,],paste(lab,"\n(1, 2 or 3)"),col="grey80",cex=0.7, pos=2) text(grid.tern[18:10,],paste(lab,"\n(4 or 5)"),col="grey80",cex=0.7, pos=4) text(grid.tern[27:19,],paste(lab,"\n(6)"),col="grey80",cex=0.7, pos=1) 

enter image description here

And with the data plotted on the chart

 df<-data.frame('1, 2 or 3'=c(10,33.3,50,100), '6'=c(0,33.3,50,0), '4 or 5'=c(90,33.3,0,0)) df X1..2.or.3 X6 X4.or.5 1 10.0 0.0 90.0 2 33.3 33.3 33.3 3 50.0 50.0 0.0 4 100.0 0.0 0.0 t(apply(df, 1, tern2cart)) -> df.tern points(df.tern, pch="*", cex=3) 

enter image description here

+8
source

Using the ggtern package that I recently published via CRAN, you can get the following:

enter image description here

The above result can be achieved using the following code:

 g <- data.frame(x=c(1,.6,.6), y=c(0,.4,0), z=c(0,0,.4), Series="Green") y <- data.frame(x=c(.6,.1,.1,.3,.6), y=c(.4,.9,.5,.3,.3), z=c( 0, 0,.4,.4,.1), Series="Yellow") b <- data.frame(x=c(.6,.3,.3,.6), y=c(.3,.3, 0, 0), z=c(.1,.4,.7,.4), Series="Blue") r <- data.frame(x=c(.3, 0,0,.3), y=c(.3,.3,0, 0), z=c(.4,.7,1,.7), Series="Red") p <- data.frame(x=c(.1,0, 0,.3,.1), y=c(.9,1,.3,.3,.5), z=c( 0,0,.7,.4,.4), Series="Purple") DATA=rbind(g,y,b,r,p) ggtern(data=DATA,aes(x,y,z)) + geom_polygon(aes(fill=Series),alpha=.5,color="black",size=0.25) + scale_fill_manual(values=as.character(unique(DATA$Series))) + theme(legend.position=c(0,1),legend.justification=c(0,1)) + labs(fill="Region",title="Sample Filled Regions") 
+3
source

Source: https://habr.com/ru/post/921169/


All Articles