Отображение небольших логарифмических тиков по оси 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)
Можно ли это отредактировать, чтобы просто отметить незначительные тики без их маркировки?
Ответы
Ответ 1
В пакете Hmisc
есть функция minor.tick
, но это плохо работает с логарифмическими шкалами. Я использую следующую функцию для получения второстепенных тиков, следующих за логарифмическим масштабом. ax
- это ось, в которой вы используете ее (то же, что и для функции axis
), n
- количество второстепенных тиков (по умолчанию 9), t.ratio
- отношение между основным и второстепенным тиками, и ...
вы можете передать дополнительные параметры axis
edit: Хорошая идея в комментариях, поэтому я отредактировал свою функцию. Есть два дополнительных параметра: 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)
Дает:
![enter image description here]()
Ответ 2
Вот простая функция для этого:
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]()
Ответ 3
Попробуйте magaxis
в пакете magicaxis.
Ответ 4
В 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
![введите описание изображения здесь]()
Ответ 5
В пакете 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)
Дает: ![enter image description here]()
Ответ 6
Используйте ""
для ярлыков второстепенных тиков.
Ответ 7
Была небольшая ошибка,
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)
}
Ответ 8
Метки оси X на первом графике на этой странице ошибочны.
Незначительные тики распределены неправильно.