# set the knitr options ... for everyone! # if you unset this, then vignette build bonks. oh, joy. #opts_knit$set(progress=TRUE) opts_knit$set(eval.after='fig.cap') # for a package vignette, you do want to echo. # opts_chunk$set(echo=FALSE,warning=FALSE,message=FALSE) opts_chunk$set(warning=FALSE,message=FALSE) #opts_chunk$set(results="asis") opts_chunk$set(cache=TRUE,cache.path="cache/") #opts_chunk$set(fig.path="figure/",dev=c("pdf","cairo_ps")) opts_chunk$set(fig.path="man/figures/",dev=c("png")) opts_chunk$set(fig.width=7,fig.height=6,dpi=100,out.width='700px',out.height='600px') # doing this means that png files are made of figures; # the savings is small, and it looks like shit: #opts_chunk$set(fig.path="figure/",dev=c("png","pdf","cairo_ps")) #opts_chunk$set(fig.width=4,fig.height=4) # for figures? this is sweave-specific? #opts_knit$set(eps=TRUE) # this would be for figures: #opts_chunk$set(out.width='.8\\textwidth') # for text wrapping: options(width=124,digits=2) opts_chunk$set(size="small") opts_chunk$set(tidy=FALSE,tidy.opts=list(width.cutoff=50,keep.blank.line=TRUE)) library(ggplot2) library(ggallin) library(dplyr) library(moments) library(microbenchmark) # chicken and egg dept: # [![CRAN](http://www.r-pkg.org/badges/version/ggallin)](http://cran.rstudio.com/package=ggallin) # [![Downloads](http://cranlogs.r-pkg.org/badges/ggallin?color=brightgreen)](http://www.r-pkg.org/pkg/ggallin) # [![Total](http://cranlogs.r-pkg.org/badges/grand-total/ggallin?color=brightgreen)](http://www.r-pkg.org/pkg/ggallin)
If you think I'm into this for the money you're dead wrong because I'm not doing this for the money. I'm doing it because it lives inside of me. -- GG Allin
A grab bag of ggplot2 extensions and hacks.
-- Steven E. Pav, shabbychef@gmail.com
This package can be installed from CRAN (not yet), via drat, or from github:
# via CRAN: (not yet) # install.packages("ggallin") # via drat: if (require(drat)) { drat:::add("shabbychef") install.packages("ggallin") } # get snapshot from github (may be buggy) if (require(devtools)) { install_github('shabbychef/ggallin') }
geom_cloud
This geom
acts nearly as a drop-in replacement for geom_errorbar
,
converting ymin
and ymax
into 'clouds' of uncertainty with alpha
proportional to normal density.
library(ggplot2) library(ggallin) library(dplyr) nobs <- 1000 set.seed(2134) mydat <- data.frame(grp=sample(c(0,1),nobs,replace=TRUE), colfac=sample(letters[1:2],nobs,replace=TRUE), rowfac=sample(letters[10 + (1:3)],nobs,replace=TRUE)) %>% mutate(x=seq(0,1,length.out=nobs) + 0.33 * grp) %>% mutate(y=0.25*rnorm(nobs) + 2*grp) %>% mutate(grp=factor(grp)) %>% mutate(se=sqrt(x)) %>% mutate(ymin=y-se,ymax=y+se) offs <- 2 ph <- mydat %>% mutate(y=y+offs,ymin=ymin+offs,ymax=ymax+offs) %>% ggplot(aes(x=x,y=y,ymin=ymin,ymax=ymax,color=grp,fill=grp)) + facet_grid(rowfac ~ colfac) + scale_y_sqrt() + geom_line() + geom_cloud(aes(fill=grp),steps=15,max_alpha=0.85,color=NA) + labs(title='geom cloud') print(ph)
The square root transform is a good compromise between raw and logarithmic scales, showing detail across different scales without over-emphasizing very small variation. However, it does not work for negative numbers. Thus a signed square root transform is useful. Along similar lines, the pseudo-log transform accepts negative numbers while providing a good view across magnitudes. Some illustrations:
library(ggplot2) library(ggallin) library(dplyr) nobs <- 100 # this is a silly example, don't blame me set.seed(1234) mydat <- data.frame(x=rnorm(nobs),z=rnorm(nobs)) %>% mutate(y=sign(z) * exp(x+z-2)) ph <- mydat %>% ggplot(aes(x=x,y=y)) + geom_line() + scale_y_continuous(trans=ssqrt_trans) print(ph) ph <- mydat %>% ggplot(aes(x=x,y=y)) + geom_line() + scale_y_continuous(trans=pseudolog10_trans) print(ph)
Scale transforms are useful for 'straightening out' crooked data graphically. Sometimes these transforms can not be expressed functionally but instead rely on data. In this case we can imagine that we have some paired data that provide the transformation x -> y. We provide a scale transformation that supports linear interpolation. We also provide another scale transformation that accepts x and positive 'weights' w, and computes y by taking the cumulative sum of weights, called a 'warp' transformation.
Here we illustrate the warp transformation by plotting the cumulative return of the 'UMD' factor against a time scale that is uniform in cumulative daily VIX (whatever that means):
library(ggplot2) library(ggallin) library(dplyr) library(aqfb.data) library(scales) data(dvix) data(dff4) rr_to_nav <- function(x) { exp(cumsum(log(1 + x))) } rets <- dff4 %>% as.data.frame() %>% tibble::rownames_to_column(var='date') %>% inner_join(dvix %>% as.data.frame() %>% setNames(c('VIX')) %>% tibble::rownames_to_column(var='date'),by='date') %>% mutate(date=as.Date(date,format='%Y-%m-%d')) %>% mutate(UMD_nav=rr_to_nav(0.01*UMD), SMB_nav=rr_to_nav(0.01*SMB), HML_nav=rr_to_nav(0.01*HML)) ph <- rets %>% ggplot(aes(x=date,y=UMD_nav)) + geom_line() + labs(y='UMD cumulative return') + labs(x='regular date scale') print(ph) # select breaks automagically ph <- rets %>% ggplot(aes(x=date,y=UMD_nav)) + geom_line() + scale_x_continuous(trans=warp_trans(x=rets$date,w=rets$VIX)) + labs(y='UMD cumulative return') + labs(x='warped date scale') print(ph) # force decade breaks: ph <- rets %>% ggplot(aes(x=date,y=UMD_nav)) + geom_line() + scale_x_continuous(trans=warp_trans(x=rets$date,w=rets$VIX, breaks=scales::date_breaks('10 years'), format=scales::date_format('%Y'))) + labs(y='UMD cumulative return') + labs(x='warped date scale') print(ph) # reverse scale as well (see composition of transforms) ph <- rets %>% ggplot(aes(x=date,y=UMD_nav)) + geom_line() + scale_x_continuous(trans=scales::reverse_trans() %of% warp_trans(x=rets$date,w=rets$VIX)) + labs(y='UMD cumulative return') + labs(x='reversed, warped date scale') print(ph)
The %of%
binary operator supports composition of scale transformations. This
is most useful for composing reverse scales with other transforms:
library(ggplot2) library(ggallin) # reverse and log scale set.seed(1234) ph <- ggplot(data.frame(x=rnorm(100),y=exp(rnorm(100,mean=-2,sd=4))),aes(x=x,y=y)) + geom_point() + scale_y_continuous(trans=scales::reverse_trans() %of% scales::log10_trans()) + labs(title='reversed and log scaled y') print(ph)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.