在R中的x轴上显示较小的对数刻度

时间:2011-08-05 11:21:04

标签: r plot axis logarithm

我有一个正态分布图和一个直方图,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)

这可以编辑为只标记次要刻度而不标记它们吗?

8 个答案:

答案 0 :(得分:11)

minor.tick中有一个函数Hmisc,但是那个函数与对数尺度相差很小。我使用以下函数来获得遵循对数标度的次要标记。 ax是您使用它的轴(与函数axis相同),n是次刻度的数量(默认为9),t.ratio是比率在主要和次要刻度之间,使用...,您可以将额外参数传递给axis

编辑:评论中的好主意,所以我编辑了我的功能。有两个额外参数,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)

给予:

enter image description here

答案 1 :(得分:4)

这是一个简单的功能:

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

给出: enter image description here

答案 2 :(得分:1)

在包magicaxis中尝试magaxis

答案 3 :(得分:1)

minorAxis程序包中有一个StratigrapheR函数,可用于任何类型的小刻度。它可以与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)

赠予:enter image description here

答案 4 :(得分:0)

使用""作为次要标记的标签。

答案 5 :(得分:0)

发生了一个小错误,

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

答案 6 :(得分:0)

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

enter image description here

答案 7 :(得分:0)

此页第一张图中的x轴标签有误。 次刻度线分布不正确。