Отображение второстепенных логарифмических делений по оси x в R

У меня есть график нормального распределения и график гистограммы с осью 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)

Можно ли отредактировать это, чтобы просто пометить второстепенные галочки, не помечая их?


person user744121    schedule 05.08.2011    source источник
comment
Или другие новые способы приветствуются! Спасибо.   -  person user744121    schedule 05.08.2011
comment
Я отредактировал ваш вопрос, добавив ссылку на предыдущий вопрос. Это делает код и проблему немного проще для понимания.   -  person Joris Meys    schedule 05.08.2011


Ответы (8)


В пакете Hmisc есть функция minor.tick, но она плохо работает с логарифмическими шкалами. Я использую следующую функцию для получения второстепенных тиков, которые следуют логарифмической шкале. ax — это ось, на которой вы его используете (такая же, как и для функции axis), n — это количество второстепенных тактов (по умолчанию 9), t.ratio — это соотношение между основными и второстепенными тактами, а с помощью ... вы можете передавать дополнительные параметры. до axis

редактировать: Хорошая идея в комментариях, поэтому я отредактировал свою функцию. Есть два дополнительных параметра: mn и mx для минимума и максимума в логарифмическом масштабе (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)

Дает:

введите здесь описание изображения

person Joris Meys    schedule 05.08.2011
comment
Спасибо. Кажется, это работает отлично для меня, но мне пришлось удалить лишнюю букву «m» в minor.ticks.axis(2m). И еще, зачем это нужно. Теперь, когда у меня есть второстепенная отметка, поскольку моя шкала начинается с 10 ^ 0, мне не нужны дополнительные второстепенные отметки до этого. Как это контролировать? - person user744121; 05.08.2011
comment
@ user744121 Я отредактировал свою функцию, хорошая идея! Лишняя буква «м» была опечаткой, я ее уже редактировал. В остальном см. дополнительные пояснения. - person Joris Meys; 05.08.2011
comment
Ваша функция кажется отличной, но у меня диапазон от 10 ^ до 4 лет 10 ^ 1. Как мы можем изменить функцию, чтобы тики находились в позициях ниже, чем mn=0?? - person JPV; 29.10.2012
comment
Это должна быть функция в graphics. - person Andy Barbour; 17.04.2013

Вот простая функция для этого:

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

Дает: введите здесь описание изображения

person mrbrich    schedule 05.02.2016
comment
tcl=par("tcl")*0.5 отличный трюк. На мой взгляд, это намного проще, чем модифицировать функцию minor.tick. - person Jared Smith; 22.10.2016

Попробуйте magaxis в пакете magicaxis.

person caesar0301    schedule 16.04.2015

В ggplot2 мы можем использовать annotation_logticks вместе с scales::trans_breaks и scales::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

введите здесь описание изображения

person Tung    schedule 19.02.2018

В пакете 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)

Дает: введите здесь описание изображения

person Sébastien Wouters    schedule 21.08.2019
comment
Это не дает ответа на вопрос. Получив достаточную репутацию, вы сможете /comment">прокомментировать любой пост; вместо этого дайте ответы которые не требуют разъяснений от спрашивающего. – Из обзора - person Rui Barradas; 21.08.2019
comment
Намного лучше, был бы полный ответ, если бы метки были в формате 10^aa соответствующими показателями степени). В любом случае, голосуйте за. - person Rui Barradas; 22.08.2019
comment
О да: я добавил это на основе ответа @mrbrich - person Sébastien Wouters; 22.08.2019

Используйте "" для меток второстепенных галочек.

person Richie Cotton    schedule 05.08.2011
comment
Если вас устраивают тики на линейной шкале того же размера, что и ваши основные тики, то это сработает. В противном случае все немного сложнее... - person Joris Meys; 05.08.2011

Произошла небольшая ошибка,

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)
}
person Lorenzo Querci    schedule 29.04.2017

Метки оси X на первом графике на этой странице ошибочны. Незначительные тики не распределены должным образом.

person ed bolton    schedule 20.06.2018