Add second x-axis in ggplot2

前提是你 提交于 2020-01-01 03:09:12

问题


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!


回答1:


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)




回答2:


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.



来源:https://stackoverflow.com/questions/22285360/add-second-x-axis-in-ggplot2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!