【问题标题】:Mixed scale on a ggplotggplot 上的混合比例
【发布时间】:2016-01-21 16:14:45
【问题描述】:

我想绘制一个图(最好使用 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

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

谢谢你的期待!

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

    由于比例失真,该图可能会产生误导,但是...您可以为两个 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

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

    【讨论】:

      【解决方案2】:

      您可以创建自己的比例,其他示例请参见 (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,小心使用 - 可能会产生误导。


      出于标记目的,通过在绘图空间中具有相等的中断,可能更容易看到函数对比例尺的影响。下面的例子显示上部被压扁了——你不能有一个超过 1 的 p 值,当在 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))
      

      【讨论】:

      • 非常感谢!这正是我要找的!但是你们两个当然是对的,这样的情节可能会产生误导。
      猜你喜欢
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多