Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add second x-axis in ggplot2

In the "graphics" package one can add a second x-axis (indicating the percentiles of the distribution) to a histogram as follows:

x  <- rnorm(1000)
hist(x, main="", xlab="Bias")
perc  <- quantile(x, seq(from=.00, to=1, by=.1))
axis(1,at=perc,labels=c("0","10%","20%","30%","40%","50%","60%","70%","80%","90%","100%"),cex=0.5, pos= -90)

That looks awkward, of course. So how can I modify the following ggplot2 code to add a second x-axis, shwing the percentiles, while the first x-axis should indicate the raw values?:

library(ggplot2)
theme_classic(base_size = 12, base_family = "")
x  <- rnorm(1000)
qplot(x, main="", xlab="Bias")
perc  <- quantile(x, seq(from=.00, to=1, by=.1))

Any help? Many thanks in advance!

like image 374
denominator Avatar asked Mar 09 '14 17:03

denominator


People also ask

How do you split the y axis in R?

Methodn1: Break Y-Axis of Plot Using gap. plot() Function of plotrix Package. In this method break y-axis of the plot using the gap. plot() Function of plotrix Package, the user first needs to install and import the plotrix package to the working console of the R, further the user needs to call the gap.


2 Answers

I'm not entirely certain what you're after, since your first example doesn't actually produce what you describe.

But in terms of simply adding the percentage along with the raw value along the x axis, the easiest strategy would probably be to simply combine the two with a line break in a single set of labels:

dat <- data.frame(x = rnorm(1000))
perc <- quantile(dat$x,seq(from = 0,to = 1,by = 0.1))
l <- paste(round(perc,1),names(perc),sep = "\n")
> ggplot(dat,aes(x = x)) + 
     geom_histogram() + 
     scale_x_continuous(breaks = perc,labels = l)

enter image description here

like image 129
joran Avatar answered Nov 10 '22 17:11

joran


Here's another approach which uses annotate(...) and does not require that the two scales have the same breaks.

library(ggplot2)
library(grid)

set.seed(123)
x     <- rnorm(1000)
perc  <- quantile(x, seq(from=.00, to=1, by=.1))
labs  <- gsub("\\%","",names(perc))   # strip "%" from names
yval  <- hist(x,breaks=30,plot=F)$count
yrng  <- diff(range(yval))
g1 <- ggplot() +
  geom_histogram(aes(x=x))+ 
  xlim(range(x))+
  coord_cartesian(ylim=c(0,1.1*max(yval)))+
  labs(x="")+
  annotate(geom = "text", x = perc, y = -0.1*yrng, label = labs, size=4) +
  annotate(geom = "text", x=0, y=-0.16*yrng, label="Bias", size=4.5)+
  theme(plot.margin = unit(c(1, 1, 2, 1), "lines"))

g2 <- ggplot_gtable(ggplot_build(g1))
g2$layout$clip[g2$layout$name == "panel"] <- "off"
grid.draw(g2)

This adds the second x-axis and the label using annotate(...). The last three lines of code turn off clipping of the viewport. Otherwise the annotations aren't visible.

Credit to @Henrik for his answer to this question.

like image 22
jlhoward Avatar answered Nov 10 '22 17:11

jlhoward