A clever use of geom smooth position =…

A clever use of geom_smooth(position = ‘jitter’) for plots looking like hand-written.

test.dframe <- data.frame(x = rnorm(100), y = rnorm(100), z = rnorm(100)
theme_xkcd <- theme(
    panel.background = element_rect(fill="white"),
    axis.ticks = element_line(colour=NA),
    panel.grid = element_line(colour="white"),
    axis.text.y = element_text(colour=NA),
    axis.text.x = element_text(colour="black"),

p <- ggplot(data=pleb.clegg, aes(x=Date, y=Pleb))+
geom_smooth(aes(y=Clegg), colour="gold", size=1, position="jitter", fill=NA)+
geom_smooth(colour="white", size=3, position="jitter", fill=NA)+
geom_smooth(colour="dark blue", size=1, position="jitter", fill=NA)+
geom_text(data=pleb.clegg[10, ], family="Humor Sans", aes(x=Date), colour="gold", y=20, label="Searches for clegg")+
geom_text(data=pleb.clegg[22, ], family="Humor Sans", aes(x=Date), colour="dark blue", y=4, label="Searches for pleb")+
geom_line(aes(y=xaxis), position = position_jitter(h = 0.1), colour="black")+
coord_cartesian(ylim=c(-5, 40))+
labs(x="", y="", title="Pleb vs Clegg: Google Keyword Volumes")+



Change the order of discrete axis Generate a…

Change the order of discrete axis.

Generate a factor with reversed levels or use a new ggplot2 option.


df$X1 = with(df, factor(X1, levels = rev(levels(X1))))

  1. Reverse the order of a discrete-valued axis
  2. Get the levels of the factor
flevels <- levels(PlantGrowth$group)
  1. "ctrl" "trt1" "trt2"
  2. Reverse the order
flevels <- rev(flevels)
  1. "trt2" "trt1" "ctrl"
bp + scale_x_discrete(limits=flevels)


Slopegraph in R Slopegraph shows the change of…


Slopegraph in R. Slopegraph shows the change of the quantity or rank.

Beautiful slopegraph example.

Theory of slopegraph.

An R and ggplot2 code example of slopegraph

R Example code.

Generate sample data

a <- data.frame(go = LETTERS[1:10], enrich = runif(10, 0, 10))
b <- data.frame(go = LETTERS[1:10], enrich = runif(10, 0, 10))
a <- cbind(a, status ='before')

b <- cbind(b, status = 'after')
ab.melt <- rbind(a, b)

Add an offset column for label positioning

ab.melt <- transform(ab.melt, offset = c(rep(2, times = 10), rep(-2, times = 10)))

ggplot(data = ab.melt, aes(x = status, y = enrich)) + geom_line(aes(group = go, colour = go)) + geom_text(aes(label = go, hjust = offset, colour = factor(go)))

scatter plot equivalent to pairs by ggplot http…

scatter plot equivalent to pairs() by ggplot.

Hadley recommends using the GGally package instead. It has a function, ggpairs that is a vastly improved pairs plot (lets you use non-continuous variables in your data frames). It plots different plots in each square, depending on the variable types:


Multiple histograms in a plot using ggplot2 ggplot…

Multiple histograms in a plot using ggplot2.

ggplot(test.melt, aes(x = value, fill = sample)) + geom_histogram(alpha = 0.3, position = 'identity', aes(y = ..density..)) + geom_density(alpha = 0.3, position = 'identity')

Be careful. The default value for the


parameter is different the histogram and density plot. So set the parameter explicitly.

Identity: overlap the two histograms.
stack: stack the two histograms on top of another.
For more options, check Position adjustments in

Default parameters of histogram and density.

geom_histogram(mapping = NULL, data = NULL, stat = "bin", position = "stack", ...)
stat_density(mapping = NULL, data = NULL, geom = "area", position = "stack", adjust = 1,
  kernel = "gaussian", trim = FALSE, na.rm = FALSE, ...)
geom_density(mapping = NULL, data = NULL, stat = "density", position = "identity",
  na.rm = FALSE, ...)

Change the label of legend not by changing…

Change the label of legend not by changing the data.

# data
grp <- gl(n=4,k=20,labels=c("group a","group b","group c", "group d"))
value <- runif(n=80, min=10, max=150)
outcome <- cut(value,2)
data <- data.frame(grp,value,outcome)

# Option 1
# breaks should be exactly the same as the levels of the factor
ggplot(data, aes(grp, fill=outcome)) + geom_bar() +xlab("group") +
    ylab("number of subjects") + 
    scale_fill_discrete("Serologic response", 
                        breaks=c("(12.1,79.7]","(79.7,147]"),   # should be the same as the levels of the factor
                        labels=c("double negative", "positive for a and/or b")

# Option 2
# simpler because factor() takes care of the levels of the factor
ggplot(data, aes(grp, 
         fill=factor(outcome,labels=c("double negative","positive for a")))) + 
    geom_bar() +xlab("group") +ylab("number of subjects") +
    labs(fill="Serologic response")


Customize the color order and label of the…

Customize the color, order and label of the legend in ggplot2
Use scale_colour_manual()

scale_colour_manual(values = c("red", "blue"), breaks = c("S2", "S1"), labels = c("sample1", "sample2"))


ggplot2 opts list https github com hadley ggplot2…

ggplot2 opts list


Sometimes R gives the error message Error in…

Sometimes R gives the error message.

Error in X11(d$display, d$width, d$height, d$pointsize, d$gamma, d$colortype,  : 
  unable to start device X11cairo

Here is the fix.


How to use eval Here is an example…

How to use eval()?
Here is an example.

test.dframe <- data.frame(x = 1:10, y = rnorm(10))                                                                                                                                
addSmooth <- function(data, smooth = TRUE) {
    p <- "ggplot(data = data, aes(x = x, y = y))"
    p.line <- "geom_line()"
    p.smooth <- "stat_smooth()"
    if (smooth == TRUE) {
        p.all <- paste(p, p.line, p.smooth, sep = " + ")
    } else {
        p.all <- paste(p, p.line, sep = " + ")
    eval(parse(text = p.all))
addSmooth(test.dframe, smooth = FALSE)

Created by Pretty R at