我想制作一个图(最好用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")
在这里你可以看到结果:
无论如何我能做到这一点吗?我想,我可以定义一个新的转换,但我没有找到任何关于如何执行此操作的说明。
感谢您的期待!
答案 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))
答案 1 :(得分:3)
您可以创建自己的比例,有关其他示例,请参阅(1,2)。以下是您的特定不连续功能的示例。
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))
同意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))