Search code examples
rplotglmnet

plot.glmnet increase size of variable labels


Currently I am using the glmnet package to run a lasso regression (which in the example below is being saved to the "fits" variable. Then when I plot the fits variable it comes up properly but the coefficient labels are very small. Any ideas how I can increase the size of these?

Reproducible example below...

require(glmnet)

#setup sample DF with 5 variables
set.seed(123)
sampleDF <- data.frame("V1"=rnorm(100,mean=0,sd=.10),"V2"=rnorm(100,mean=0,sd=.10),"V3"=rnorm(100,mean=0,sd=.10),"V4"=rnorm(100,mean=0,sd=.10),"V5"=rnorm(100,mean=0,sd=.10))

#break data into yVector & xMatrix to put into glmnet
yVector <- sampleDF[,1]
xMatrix <- as.matrix(sampleDF[,2:ncol(sampleDF)])

#use k-fold cross validation to find the min lambda
cv.glmmod <- cv.glmnet(xMatrix,yVector,alpha=1,nfolds=nrow(xMatrix),grouped=FALSE)
best_lambda <- cv.glmmod$lambda.min

#run glmnet
fits <- glmnet(xMatrix, yVector, family="gaussian", alpha=1, nlambda=100)

#plot results
plot(fits,label=TRUE,xvar="lambda")

Solution

  • As it looks as if the label size is hard coded (and global changes to cex will change the other plot features) you can change plot.glmnet

    # copy the plot function
    myPlot <- plotCoef
    
    # replace relevant part
    body(myPlot)[[14]] <- quote(if (label) {
      nnz = length(which)
      xpos = max(index)
      pos = 4
      if (xvar == "lambda") {
        xpos = min(index)
        pos = 2
      }
      xpos = rep(xpos, nnz)
      ypos = beta[, ncol(beta)]
      text(xpos, ypos, paste(which), pos = pos, ...) # only changed this with ...
    })
    
    # copy first level of plot and replace plotCoef  with myPlot
    newplotter <- plot.glmnet
    
    body(newplotter)[[3]] <- quote(myPlot(x$beta, lambda = x$lambda, 
                                         df = x$df, dev = x$dev.ratio, 
                                            label = label, xvar = xvar, ...))
    

    This should increase the text (note the plot need to be wide enough)

    newplotter(fits,label=TRUE,xvar="lambda", cex=1.2)
    

    enter image description here