在ggplot2中添加第二个x轴

7
在“图形”包中,可以按照以下方式将第二个x轴(表示分布百分位数)添加到直方图中:
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)

这看起来很尴尬。所以我该如何修改以下 ggplot2 代码以添加第二个 x 轴,显示百分位数,而第一个 x 轴应指示原始值?

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))

需要帮忙吗?非常感谢您的提前帮助!

2个回答

10

我不是完全确定您想要什么,因为您的第一个示例实际上并没有产生您描述的内容。

但是,如果只是在x轴上简单地添加百分比和原始值,最简单的策略可能是将两者与换行符组合成单个标签集:

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)

这里输入图片描述


9
这里有另一种方法,它使用annotate(...)并不要求两个比例尺具有相同的间断点。

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)

这将使用annotate(...)添加第二个x轴和标签。代码的最后三行关闭了视口的裁剪,否则注释将不可见。
感谢@Henrik对这个问题的回答。

4
如果您正在阅读此内容并且年份是2017年,那么请将最后一行更改为“grid :: grid.draw(g2)”,您不需要使用“library(grid)”。 “Grid”已添加到“base”。 - tsouchlarakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接