16

我有一个正态分布图和一个直方图,其中 x 轴以对数刻度显示 0、10^0、10^1 ...我想在主要刻度之间包含次要刻度。实际上,我能够使用上一个问题中给我的解决方案将主要刻度格式从 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)

可以将其编辑为仅标记次要刻度而不标记它们吗?

4

8 回答 8

13

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

编辑:评论中的好主意,所以我编辑了我的功能。有两个额外的参数,mn数刻度上mx的最小值和最大值(因此意味着最小值是 10^0 或 1 !)mn=0

功能:

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)

给出:

在此处输入图像描述

于 2011-08-05T12:53:38.213 回答
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))

给出: 在此处输入图像描述

于 2016-02-05T16:07:53.203 回答
2

尝试使用magicaxismagaxis包。

于 2015-04-16T07:59:19.123 回答
2

ggplot2中,我们可以与和annotation_logticks一起使用。以下是从上面的链接中获取的示例。scales::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

在此处输入图像描述

于 2018-02-19T05:44:01.113 回答
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)

给出:在此处输入图像描述

于 2019-08-21T12:15:11.507 回答
0

用于""次要刻度的标签。

于 2011-08-05T11:47:44.937 回答
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)
}
于 2017-04-29T20:46:56.747 回答
0

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

于 2018-06-20T15:16:08.377 回答