Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R: Add text to plots in lower rightern corner outside plot area

Tags:

text

plot

r

I am plotting multiple graphs in baseR and I am trying to plot a text in the lower rightern corner of my plots. I tried using mtext() but this doesn't give me the desired result. How would you do this? The idea in the end is to generate something like the graphic below. How could I do this?

enter image description here

Here is my code I use to generate the plots.

xy <- data.frame(NAME=c("NAME1", "NAME1","NAME1","NAME1","NAME2","NAME2","NAME2"),ID=c(47,47,47,47,259,259,259),YEAR=c(1932,1942,1965,1989,2007,2008,2014),VALUE=c(0,NA,-6,-16,0,-9,-28), test=c("text1","text1","text1","text1","text2","text2","text2"))

# split data by index 
ind <- split(x = xy,f = xy[,'ID'])

plot1 <- function(x) {
  fname <- paste0(x[1, 'ID'], '.png')
  png(fname, width=1679, height=1165, res=150)
  par(mar=c(6,8,6,5))
  plot(x = c(1946, 2014),
       y = range(x$VALUE, na.rm=TRUE),
       type='n',
       main=x[1, 'NAME'],
       xlab="Time [Years]",
       ylab="Value [m]")
  axis(2, at = seq(-100000, 100000, 100), cex.axis=1, labels=FALSE, tcl=-0.3)
  points(x[,c('YEAR','VALUE')], type="l", lwd=2)
  points(x[,c('YEAR','VALUE')], type="p", lwd=1, cex=0.5, pch=21, bg='white')
  abline(h=0)
  mtext(x$test, side=1, )

  dev.off()
}

plot2 <- function(x) {
  fname <- paste0(x[1, 'ID'], '.png')
  png(fname, width=1679, height=1165, res=150)    
  par(mar=c(6,8,6,5))
  plot(x[,c('YEAR','VALUE')],
       type='n',
       main=x[1, 'NAME'],
       xlab="Time [Years]",
       ylab="value [m]")
  axis(2, at = seq(-100000, 100000, 100), cex.axis=1, labels=FALSE, tcl=-0.3)
  points(x[,c('YEAR','VALUE')], type="l", lwd=2)
  points(x[,c('YEAR','VALUE')], type="p", lwd=1, cex=0.5, pch=21, bg='white')
  abline(h=0)
  mtext(x$test, side=1)
  dev.off() 
}

lapply(ind, function(x) ifelse(any(x$YEAR < 1946 & x$YEAR < 2014), plot2(x), plot1(x)))
like image 662
kurdtc Avatar asked Sep 18 '14 07:09

kurdtc


3 Answers

With mtext() you can put your text at plot margin. In your case, you can try playing with parameters line and at. See help(mtext)

plot(1:10,10:1)
mtext('text is here', side=1, line=3.5, at=9)

enter image description here

like image 101
HongboZhu Avatar answered Oct 22 '22 06:10

HongboZhu


plot(1:10,10:1)
text(c(0,6,9), -0.6, paste('hello world', c(1:3)), xpd=NA)

With the text() function you can take reference for positioning to the coordinates of your plot and you can plot several text elements at ones.

The xpd parameter allows you to choose between three possibilities where you want to plot your element (also available for other elements like points and lines):

  1. FALSE : only inside the plot
  2. TRUE : in the outer plotting area
  3. NA : everywhere on your plotting device
like image 23
and-bri Avatar answered Oct 22 '22 07:10

and-bri


plot(1)
title(sub="hallo", adj=1, line=3, font=2)
like image 42
Berry Boessenkool Avatar answered Oct 22 '22 05:10

Berry Boessenkool