【问题标题】:Displaying minor logarithmic ticks in x-axis in R在 R 中的 x 轴上显示次要对数刻度
【发布时间】:2011-10-20 18:59:12
【问题描述】:

我有一个正态分布图和一个直方图,其中 x 轴以对数刻度显示 0、10^0、10^1 ...我想在主要刻度之间包含次要刻度。实际上,我可以使用previous question 中提供的解决方案将主要刻度格式从 1、2、3 等更改为 10^0、10^1、10^2、10^3。我对主要刻度使用了以下代码:

major.ticks <- axTicks(1)
labels <- sapply(major.ticks,function(i)
            as.expression(bquote(10^ .(i)))
          )
axis(1,at=major.ticks,labels=labels)

是否可以对其进行编辑以仅标记次要刻度而不标记它们?

【问题讨论】:

  • 或其他新方式,欢迎!谢谢。
  • 我编辑了您的问题以包含指向上一个问题的链接。这使得代码和问题更容易理解。

标签: r plot axis logarithm


【解决方案1】:

StratigrapheR 包中有 minorAxis 函数,可用于任何类型的次要刻度。它可以与seq_log 函数一起使用来制作对数刻度:

library(StratigrapheR)

x <- exp(rnorm(200, 5))
hist(log10(x), 20, xaxt="n", xlim=c(0, 4), xlab = "x", main = "Logarithmic Histogram of x")

ticks <- seq_log(10^0,10^4, divide = T)

lab <- sapply(0:4, function(i) as.expression(bquote(10^ .(i))))

minorAxis(1, at.maj = log10(ticks[[1]]), at.min = log10(ticks[[2]]), labels = lab)

给:

【讨论】:

【解决方案2】:

本页第一个图中的 x 轴标签有误。 次要刻度未正确分布。

【讨论】:

    【解决方案3】:

    ggplot2 中,我们可以将annotation_logticksscales::trans_breaksscales::trans_format 一起使用。以下是从上面的链接中获取的示例。

        library(ggplot2)
    
        a <- ggplot(msleep, aes(bodywt, brainwt)) +
          geom_point(na.rm = TRUE) +
          scale_x_log10(
            breaks = scales::trans_breaks("log10", function(x) 10^x),
            labels = scales::trans_format("log10", scales::math_format(10^.x))
          ) +
          scale_y_log10(
            breaks = scales::trans_breaks("log10", function(x) 10^x),
            labels = scales::trans_format("log10", scales::math_format(10^.x))
          ) +
          theme_bw()
    
        a + annotation_logticks() # Default: log ticks on bottom and left
    

    【讨论】:

      【解决方案4】:

      有一个小错误,

      lims&lt;-lims[3:4] 不见了

         minor.ticks.axis <- function(ax,n,t.ratio=0.5,mn,mx,...){
      
        lims <- par("usr")
        if(ax %in%c(1,3)) lims <- lims[1:2] else lims <- lims[3:4]
      
        major.ticks <- pretty(lims,n=5)
        if(missing(mn)) mn <- min(major.ticks)
        if(missing(mx)) mx <- max(major.ticks)
      
        major.ticks <- major.ticks[major.ticks >= mn & major.ticks <= mx]
      
        labels <- sapply(major.ticks,function(i)
                  as.expression(bquote(10^ .(i)))
                )
        axis(ax,at=major.ticks,labels=labels,...)
      
        n <- n+2
        minors <- log10(pretty(10^major.ticks[1:2],n))-major.ticks[1]
        minors <- minors[-c(1,n)]
      
        minor.ticks = c(outer(minors,major.ticks,`+`))
        minor.ticks <- minor.ticks[minor.ticks > mn & minor.ticks < mx]
      
      
        axis(ax,at=minor.ticks,tcl=par("tcl")*t.ratio,labels=FALSE)
      }
      

      【讨论】:

        【解决方案5】:

        这是一个简单的函数:

        log10.axis <- function(side, at, ...) {
            at.minor <- log10(outer(1:9, 10^(min(at):max(at))))
            lab <- sapply(at, function(i) as.expression(bquote(10^ .(i))))
            axis(side=side, at=at.minor, labels=NA, tcl=par("tcl")*0.5, ...)
            axis(side=side, at=at, labels=lab, ...)
        }
        

        这是一个例子:

        x <- exp(rnorm(200, 5))
        hist(log(x), 20, xaxt="n", xlim=c(0, 8))
        log10.axis(1, at=seq(0, 8, 2))
        

        提供:

        【讨论】:

        • tcl=par("tcl")*0.5 是一个很棒的技巧。在我看来,这比修改minor.tick 函数要简单得多
        【解决方案6】:

        在包magicaxis 中尝试magaxis

        【讨论】:

          【解决方案7】:

          Hmisc 包中有一个函数 minor.tick,但该函数对对数刻度的处理效果不佳。我使用以下函数来获取遵循对数刻度的小刻度。 ax 是您使用它的轴(与函数 axis 相同),n 是次要刻度的数量(默认为 9),t.ratio 是主要和次要刻度之间的比率,并且使用...,您可以将额外的参数传递给axis

          edit : cmets 中的好主意,所以我编辑了我的函数。有两个额外的参数,mnmx 用于对数刻度上的最小值和最大值mn=0 因此表示最小值是 10^0 或 1!)

          功能:

          minor.ticks.axis <- function(ax,n,t.ratio=0.5,mn,mx,...){
          
            lims <- par("usr")
            if(ax %in%c(1,3)) lims <- lims[1:2] else lims[3:4]
          
            major.ticks <- pretty(lims,n=5)
            if(missing(mn)) mn <- min(major.ticks)
            if(missing(mx)) mx <- max(major.ticks)
          
            major.ticks <- major.ticks[major.ticks >= mn & major.ticks <= mx]
          
            labels <- sapply(major.ticks,function(i)
                      as.expression(bquote(10^ .(i)))
                    )
            axis(ax,at=major.ticks,labels=labels,...)
          
            n <- n+2
            minors <- log10(pretty(10^major.ticks[1:2],n))-major.ticks[1]
            minors <- minors[-c(1,n)]
          
            minor.ticks = c(outer(minors,major.ticks,`+`))
            minor.ticks <- minor.ticks[minor.ticks > mn & minor.ticks < mx]
          
          
            axis(ax,at=minor.ticks,tcl=par("tcl")*t.ratio,labels=FALSE)
          }
          

          这可以应用如下:

          x <- 10^(0:8)
          y <- 1:9
          plot(log10(x),y,xaxt="n",xlab="x",xlim=c(0,9))
          minor.ticks.axis(1,9,mn=0,mx=8)
          

          给:

          【讨论】:

          • 谢谢。这对我来说似乎工作得很好,但我不得不删除minor.ticks.axis(2m) 中多余的'm'。另外,为什么需要。现在我有了次要刻度,由于我的刻度从 10^0 开始,在此之前我不想要额外的次要刻度。怎么控制?
          • @user744121 我编辑了我的函数,好主意!额外的“m”是一个错字,我之前编辑过那个。其余的,请参阅额外说明。
          • 你的功能看起来很棒,但我的范围在 10^-4 yo 10 ^1 之间。我们如何更改函数以使刻度低于 mn=0 的位置??
          • 这应该是graphics中的一个函数。
          【解决方案8】:

          使用"" 作为次要刻度的标签。

          【讨论】:

          • 如果您对与主要刻度相同大小的线性刻度上的刻度感到满意,那么这将起作用。否则事情会有点复杂......
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-05
          • 1970-01-01
          • 2020-01-15
          • 1970-01-01
          • 2015-09-02
          相关资源
          最近更新 更多