ggplot上的混合比例

时间:2016-01-21 16:14:46

标签: r plot ggplot2

我想制作一个图(最好用ggplot2),其中x轴有不同的比例。 更确切地说,我希望我的比例从大约0.001到0.05对数,而非对数从0.05到1.0

我目前的情节代码是:

ggplot(DF, aes(x=DF$RAW.PVAL, col=DF$sample))+stat_ecdf()+geom_abline()+xlim(0,1)+ylim(0,1)+xlab("P Value")+ylab("Frequecy")+ggtitle("Type I error control")+labs(colour="Sample")

在这里你可以看到结果:

Type1ErrorControl

无论如何我能做到这一点吗?我想,我可以定义一个新的转换,但我没有找到任何关于如何执行此操作的说明。

感谢您的期待!

2 个答案:

答案 0 :(得分:5)

由于比例失真,该图可能会产生误导,但是......您可以为两个x范围绘制单独的面板,一个具有对数缩放,另一个具有线性缩放,然后将它们组合在一起。我们将更改绘图边距以控制绘图之间的空间量并获得适当的重叠。

library(ggplot2)
library(scales)
library(grid)
library(gridExtra)

# Fake data
test <- data.frame(x=c(seq(1,100, length.out=20), 101:110), y=1:30)

左图(x <= 100):

p1 = ggplot(test[test$x<=100,], aes(x=x,y=y)) + 
  geom_point(size=2) +
  scale_x_log10(limits=c(1,100), breaks=c(1,5,10, seq(20,100,20))) +
  coord_cartesian(xlim=c(0.8,105), ylim=c(0,32), expand=FALSE) +
  scale_y_continuous(limits=c(0,30)) +
  theme(plot.margin=unit(c(0,-0.2,0,0),"lines")) +
  labs(x="")

右图(x> = 100):

p2 = ggplot(test[test$x>=100,], aes(x=x,y=y)) + 
  geom_point(size=2) +
  scale_x_continuous(limits=c(100,110), breaks=seq(100,110,2)) +
  coord_cartesian(xlim=c(100,111), ylim=c(0,32), expand=FALSE) +
  theme(plot.margin=unit(c(0,0,0,-0.2), "lines"),
        axis.title.y=element_blank(),
        axis.ticks.y=element_blank(),
        axis.text.y=element_blank()) +
  labs(y="", x="")

grid.arrange(arrangeGrob(p1, p2, widths=c(0.7,0.3), ncol=2),
             textGrob("x-label"), ncol=1, heights=c(0.95,0.05))

enter image description here

答案 1 :(得分:3)

您可以创建自己的比例,有关其他示例,请参阅(12)。以下是您的特定不连续功能的示例。

library(scales)
library(ggplot2)

MixLogF <- function(x){ 
    if(x < 0.05){r <- log(x) - log(0.05) + 0.05}
    else {r <- x}
    return(r) 
}
MixLogV <- Vectorize(MixLogF)
InvMixLogF <- function(x){ 
    if(x < 0.05){r <- exp(x - 0.05 + log(0.05))}
    else {r <- x}
    return(r)
}
InvMixLogV <- Vectorize(InvMixLogF)
MixLogV_trans <- function() trans_new("MixLogV",MixLogV,InvMixLogV,domain = c(0.001, Inf))

y <- (1:100)/100
x <- MixLogV(y)
ExpDat <- data.frame(x,y)
orig <- ggplot(data=ExpDat, aes(x=y,y=y)) + geom_point()
orig
orig + scale_x_continuous(trans="MixLogV", limits=c(0.01, 1), breaks=c(0.01,0.02,0.03,0.04,0.05,0.30,0.80))

enter image description here

同意eipi10,小心使用 - 可能会产生误导。

出于标注目的,通过在绘图空间中具有相等的间隔,可以更容易地看到函数对比例的影响。下面的例子显示上部非常挤压 - 你的p值不能超过1,当突破0.05时与exp(log(0.05) - 0.95) ~0.02的距离相同。

#For nice even breaks
blog <- c(0.01,0.02,0.03,0.04)
blin <- 0.05 + log(0.05) - log(rev(blog))
orig + scale_x_continuous(trans="MixLogV", limits=c(0.01, blin[4]), 
       breaks=c(blog,0.05,blin), labels = format(c(blog,0.05,blin),digits=2,scientific = FALSE))

enter image description here