#---------------01. SCORES MATRIX-----------------------------------

plsda.scores<-plsda.res$variates[[1]] #extracting X scores

plsda.scores<-as.data.frame(plsda.scores) #convert to dataframe

plsda.scores<-cbind(info,plsda.scores) #merging plsda score results and info data

#----------------02. LOADINGS MATRIX----------------------------------

plsda.loadings<-plsda.res$loadings[[1]] #extracting loadings

plsda.loadings<-as.data.frame(plsda.loadings) #convert to dataframe

plsda.loadings<-rownames_to_column(plsda.loadings,var=“Type”) #label column to plot

#--------------03. BIPLOT--------------------------------

#------------prepare loading data---------------------

plsda.loadings2<-plsda.loadings

plsda.loadings2$x<-“Element” #variables in my study are chemical elements, so variables group

plsda.loadings2[,“Deposit subtype”]<-“non” #this column is empty by I need it in order to have same columns that scores table

plsda.loadings2[,“Altered rocks”]<-"" #this column is empty by I need it in order to have same columns that scores table

#------------prepare scores data---------------------

plsda.scores2<-plsda.scores

plsda.scores2$Type<-"" #observations column is empty because I label only variables

plsda.scores2$x<-“Sample” #group of samples

plsda.scores2<- mutate_if(plsda.scores2,is.numeric,~ . / 9) # scores values are modified in order to scale them to loadings

#-----merge scores and loadings--------------

biplot.data<-rbind(plsda.loadings2,plsda.scores2[,c(5,11,13,18:22)]) # merge

I hope that can help you.

Really this is not a biplot, it’s just a way to display scores and loadings in same plot.