# plotCircle.R
# Function to plot monthly rates using a grey shaded circular "country"
# Assumes estimates are in numerical order, 1=Jan, 2=Feb, etc
# April 2009
#' Circular Plot
#'
#' Circular plot of a monthly variable.
#'
#' This circular plot can be useful for estimates of an annual seasonal
#' pattern. Darker shades of grey correspond to larger numbers.
#'
#' @param months monthly variable to plot, the shades of grey of the 12
#' segments are proportional to this variable. The first result is assumed to
#' be January, the second February, and so on.
#' @param dp decimal places for statistics, default=1.
#' @param \dots additional arguments to \code{plot}
#' @author Adrian Barnett \email{a.barnett@qut.edu.au}
#' @examples
#' \donttest{
#' plotCircle(months=seq(1,12,1),dp=0)
#' }
#'
#' @export
plotCircle<-function(months,dp=1, ...){
if ((length(months)==12)==FALSE) {stop('Length of monthly estimates must be 12')}
op <- par(no.readonly = TRUE) # the whole list of settable par's.
# create grey scale, standardise results to [0.2,1]
# add small number to prevent very dark colours
stan0to1<-(months-min(months))/(max(months)-min(months))
stan1to0<-abs(stan0to1-1) # reverse so that darker shades are higher
stan<-(stan1to0*0.7)+0.3 # [0.3,1]
dens=gray(stan)
plot(c(0),c(0),bty='n',xlab='',main='',ylab='',type='p',xlim=c(-1,1),ylim=c(-1,1),
col='white',yaxt='n',xaxt='n', ...) # blank plot
# important constants
bins<-12
clockstart=pi/2 # default clock start at 12 o'clock
half<- 2*pi/(bins*2) # for moving text half-way round
start<-pi/4
scale<-1
detail<-50
# Polygons for each month
for (m in 1:12){
poly<-matrix(data=NA,nrow=((detail+1)*2)+3,ncol=2)
index<-0
index<-index+1
mstart<-(2*pi*m/bins)+start
poly[index,1]<- -1*scale*cos(mstart);
poly[index,2]<-1*scale*sin(mstart);
index<-index+1
poly[index,1]<- -0.7*scale*cos(mstart);
poly[index,2]<-0.7*scale*sin(mstart);
for (i in 0:detail){
index<-index+1
x<-(mstart+(2*pi*i/(detail*bins)))
poly[index,1]<- -0.7*scale*cos(x);
poly[index,2]<-0.7*scale*sin(x);
}
index<-index+1
poly[index,1]<- -1*scale*cos(x);
poly[index,2]<-1*scale*sin(x);
for (i in detail:0){
index<-index+1
x<-(mstart+(2*pi*i/(detail*bins)))
poly[index,1]<- -1*scale*cos(x);
poly[index,2]<-1*scale*sin(x);
}
polygon(poly,col=dens[m],border='black')
}
# Month labels
for (j in 1:bins){
x<- -0.85*cos((2*pi*j/bins)+start+half)
y<-0.85*sin((2*pi*j/bins)+start+half)
label<-month.abb[j]
text(x,y,label)
}
## Add a colour bar to the centre of the plot
# total bar height = 1
bartoplot<-seq(1,0.3,-0.1)
dens<-gray(bartoplot)
width<-0.1
height<-0.05
nbars<-length(bartoplot)
# unstandardise results for text label
unstan<-(((bartoplot-0.3)/0.7)*(max(months)-min(months)))+min(months)
for (i in 1:nbars){
x<-c(-width,width,width,-width,-width)-width
yref<-((i-1)-(nbars/2))/(nbars+2)
y<-c(yref-height,yref-height,yref+height,yref+height,yref-height)
polygon(x,y,col=dens[i],border=NA,lwd=1)
# text label
clabel2<-formatC(unstan[nbars-i+1], format="f", digits=dp) # convert to character
text(2*width,yref,clabel2)
}
par(op) # restore graphic settings
} # end of function
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.