Working with ggplot, version 2

June 6, 2007
By

(This article was first published on V. » R, and kindly contributed to R-bloggers)

In my previous post on this issue, I had presented a code that made weighted boxplots and annotated them with boxplot statistics and the mean values. The problem with that code was that it printed these annotations right on the vertical axes of the boxplots. Also, a relatively minor problem was that, when the values of two statistics were too close to each other, they were printed one on top of the other.

As the horizontal axis was discrete, ggplot was not able to position the annotations in between two boxplots

With Hadley’s help again, I have managed to fix both of these problems. In the output of the following code, annotations are printed at a fixed distance away from the vertical axis. This is achieved by using grid rather than ggplot to print annotations. With a minor tweak, the distance between annotations is increased if they are too close to each other.

The revised code is as follows.

library(ggplot)
vplot2 <- function(dataset,xvar,yvar,v1,v2){
  ggopt(axis.colour="black")
  p <- ggplot(dataset,aesthetics=list(x=x,y=y, weight=Multiplier),
                 colour="black")
  p$xlabel<-xvar
  p$ylabel<-yvar
  (p<-ggpoint(ggboxplot(p,colour="black",orientation="vertical")))
  split(dataset,dataset$x)->cl
  dots <- do.call(rbind, lapply(cl, function(df) {
	data.frame(x = df[1, ]$x,dots = boxplot_stats_weighted(df$y,
                   weights=df$Multiplier)$stats[3])
      }))
  means<-do.call(rbind, lapply(cl,function(df){
        data.frame(
                   x=df[1,]$x,
                   mean=weighted.mean(df$y,df$Multiplier)
                   )
      }))
  (p<-ggpoint(p, data=means, aes=list(x=x, y=mean), colour="magenta"))
  (pscontinuous(p,variable="y",range=c(v1,v2))->p)
  print(p,pretty=F)
  grid.text(format(dots$dots,digits=2),x=unit(as.numeric(dots$x)+0.4,
            "native"), y=unit(dots$dots,"native"),gp=gpar(col="blue"),
            vp="layout::panel_1_1")
  dots$dots->means$dots
  (means$mean-means$dots)/(v2-v1)->means$diff
  ifelse(means$diff>=0 & means$diff<0.03,0.03,means$diff)->means$diff
  ifelse(means$diff<0 & means$diff>-0.03,-0.03,means$diff)->means$diff
  means$dots+(means$diff*(v2-v1))->means$y
  grid.text(format(means$mean,digits=2),x=unit(as.numeric(means$x)+0.4,
            "native"), y=unit(means$y,"native"),gp=gpar(col="magenta"),
            vp="layout::panel_1_1")
}


To leave a comment for the author, please follow the link and comment on their blog: V. » R.

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...



If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...

Comments are closed.

Sponsors

Mango solutions



RStudio homepage



Zero Inflated Models and Generalized Linear Mixed Models with R

Quantide: statistical consulting and training



http://www.eoda.de







ODSC

ODSC

CRC R books series











Contact us if you wish to help support R-bloggers, and place your banner here.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)